【问题标题】:C++ namespaces - "using" or explicitly stated? [duplicate]C++ 命名空间 - “使用”或明确说明? [复制]
【发布时间】:2011-01-05 20:29:42
【问题描述】:

可能的重复:
Why is ‘using namespace std;’ considered a bad practice in C++?
Using std Namespace

这只是偏好问题吗?还是有正当理由偏爱

using namespace std;
#include <string>
myString string;

#include <string>
myString std::string;

我认为每次显式声明命名空间,同时拖入输入,避免任何名称冲突的可能性(或者编译器会警告歧义?)

问题:有没有一种令人信服的论点?

【问题讨论】:

标签: c++ namespaces coding-style


【解决方案1】:

这是我在同一主题上写的另一个答案的修改版本。现在升级到第 3 版。

主要问题是名称冲突,因为如果您的代码中有一个名为 count 的变量,而您是 using namespace std;,那么您的意思就会模棱两可。不仅仅是countreverseequal 也将包括在内,它们都是常见的标识符。例如,这将导致编译错误:

#include <algorithm>
using namespace std;

int count;
int main(int argc, char* argv[]){
    count = 1;
}

不管编译器的所有问题,对于任何来阅读您的代码的人来说都是一个问题。这额外的 5 个字符可确保下一个维护您的代码的人确切地知道您的意思,而不必在您编写 string 时每隔一行检查文件顶部以查看您的意思是 std::string 还是 mylib::string


还值得注意的是,您永远不应该将using namspace xyz 放在头文件中,因为它可以传播到包含该头文件的所有文件,即使他们不想使用该名称空间。这里的另一个问题是,还不清楚 std 命名空间是否已导入,因此维护者(或 3 个月后的您)添加了一个与包含在同一编译单元中的一些晦涩的 std 函数同名的变量,并且然后花了一个小时试图找出编译错误的原因。

(来自 Effective C++)在大多数情况下,使用它是非常有益的

using std::swap

好像有一个专门的交换版本,编译器会使用它,否则它将退回到std::swap。如果你调用std::swap,你总是使用基本版本,它不会调用专业版本(即使它存在)。

以使用pimpl idiom 的代码为例。默认副本可以复制实际实现中的所有数据,而所有需要做的就是交换指针。使用专门的交换可以节省大量的执行时间,设计良好的库应该专门化它。


总之,

  • 总是更喜欢using std::swap 而不是std::swap()

  • 由于传播,不惜一切代价避免在标头中使用using namespace std,尽量避免在实现文件中使用它。

  • 在每个文件的顶部都有数千个 using std::foo 不是要走的路。最多用于常用类。

其他都是意见。

【讨论】:

  • 大声笑......(几乎)这个问题的每个骗子都有你的答案......:D
【解决方案2】:

我个人更喜欢using 声明而不是using 指令。

例如:

#include<string>
using std::string;

string x="abc";

使用using 指令将整个命名空间带入作用域,这可能会导致以后出现名称冲突问题。

更多信息请阅读this(强烈推荐)。

【讨论】:

    【解决方案3】:

    在 cpp 文件中使用很好。您更喜欢标题中的第二种语法,这样您就不会在整个项目中传播它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 2013-08-17
      • 2011-09-12
      相关资源
      最近更新 更多