关于C ++命名空间:C ++命名空间 – “使用”还是明确声明?

C++ namespaces - “using” or explicitly stated?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
Why is ‘using namespace std;’ considered a bad practice in C++?
Using std Namespace

这只是个人喜好的问题吗?还是有合理的理由选择

1
2
3
using namespace std;
#include <string>
myString string;

1
2
#include <string>
myString std::string;

我认为每次在拖拽类型时都显式地声明名称空间可以避免任何名称冲突的可能性(或者编译器会警告是否存在歧义?)

问题:是否有一个令人信服的论点?


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

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

1
2
3
4
5
6
7
#include
using namespace std;

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

不管编译器有什么问题,任何人来读你的代码都是一个问题。这些额外的5个字符确保下一个维护代码的人完全知道您的意思,而不必每隔一行检查文件的顶部,以查看您在编写string时是指std::string还是mylib::string

< BR>值得注意的是,您不应该将using namspace xyz放在头文件中,因为它可以传播到包含该头文件的所有文件,即使它们不想使用该名称空间。这里的另一个问题是,还不清楚std名称空间是否已被导入,因此维护人员(或您在3个月内)添加了一个与包含在同一编译单元中的某个模糊std函数同名的变量,然后花了一个小时来查找编译错误的原因。

(从有效C++)在大多数情况下使用非常有益。

1
using std::swap

就像有一个专门的swap版本一样,编译器将使用它,否则它将回到std::swap上。如果调用std::swap,则始终使用基本版本,而基本版本不会调用专用版本(即使存在)。

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

< BR>综上所述,

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

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

  • 在每个文件的顶部都有成千上万的using std::foo不是一个可行的方法。最多将其用于常用类。

其他一切都是意见。


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

例如:

1
2
3
4
#include<string>
using std::string;

string x="abc";

使用using指令将整个名称空间引入范围,这可能会在以后引起名称冲突问题。

有关详细信息,请阅读(强烈建议)。


CPP文件中的using很好。您希望在头中使用第二种语法,这样就不会在整个项目中传播它们。