“使用”还是明确说明?

可能重复:
为什么'使用名称空间标准;' 在C ++中被认为是不好的做法?
使用std命名空间

这只是一个偏好问题吗? 或者是否有更好的理由

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

要么

#include <string>
myString std::string;

我想,每次显式声明命名空间,而拖动类型,避免名称冲突的任何可能性(或编译器会警告含糊不清?)

问题:这种或那种方式是否有令人信服的论点?


这是我为同一主题撰写的另一个答案的修改版本。 现在版本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 string


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

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

using std::swap

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

以例如使用pimpl成语的代码为例。 作为默认拷贝可以拷贝实际实现中的所有数据,因为所有需要做的就是交换指针。 使用专门的交换可以节省大量的执行时间,精心设计的库应该专门化它。


综上所述,

  • 总是比较喜欢using std::swap over std::swap()

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

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

  • 其他一切都是意见。


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

    例如:

    #include<string>
    using std::string;
    
    string x="abc";
    

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

    欲了解更多信息,请阅读 (强烈推荐)。


    用法在cpp文件中很好。 你会更喜欢标题中的第二种语法,所以你不会让它们在整个项目中传播。

    链接地址: http://www.djcxy.com/p/29787.html

    上一篇: "using" or explicitly stated?

    下一篇: Using namespace std vs other alternatives