C ++命名空间 - “使用”还是明确声明?

时间:2010-01-16 13:26:17

标签: c++ namespaces coding-style

  

可能重复:
  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;

我认为每次显式声明命名空间,而拖动键入,可以避免任何名称冲突的可能性(或编译器是否会警告歧义?)

问题:这种或那种方式存在令人信服的争论吗?

3 个答案:

答案 0 :(得分:4)

这是我在同一主题上写的另一个答案的修改版本。现在最多3个版本。

主要问题是名称冲突,因为如果你的代码中有一个名为count的变量而你是using namespace std;,那么你的意思就不明确了。它不仅仅是count。还会包含reverseequal,这些都是常见的标识符。例如,这将导致编译错误:

#include <algorithm>
using namespace std;

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

忽略编译器的所有问题,任何来阅读代码的人都会遇到问题。这些额外的5个字符可确保维护代码的下一个人确切知道您的意思,而无需在每隔一行检查文件顶部,以便在撰写std::stringmylib::string时查看stringusing namspace xyz 1}}


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

(来自Effective C ++)在大多数情况下,使用

是非常有益的
std::swap

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

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


总之,

  • 始终优先于std::swap()

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

  • 在每个文件的顶部都有数千个{{1}},这是不可取的。最多使用它用于常用类。

其他一切都是意见。

答案 1 :(得分:3)

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

例如:

#include<string>
using std::string;

string x="abc";

使用using指令将整个命名空间放入范围,以后可能会导致名称冲突问题。

有关详情,请参阅 this (强烈推荐)。

答案 2 :(得分:2)

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