可能重复:
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;
我认为每次显式声明命名空间,而拖动键入,可以避免任何名称冲突的可能性(或编译器是否会警告歧义?)
问题:这种或那种方式存在令人信服的争论吗?
答案 0 :(得分:4)
这是我在同一主题上写的另一个答案的修改版本。现在最多3个版本。
主要问题是名称冲突,因为如果你的代码中有一个名为count
的变量而你是using namespace std;
,那么你的意思就不明确了。它不仅仅是count
。还会包含reverse
和equal
,这些都是常见的标识符。例如,这将导致编译错误:
#include <algorithm>
using namespace std;
int count;
int main(int argc, char* argv[]){
count = 1;
}
忽略编译器的所有问题,任何来阅读代码的人都会遇到问题。这些额外的5个字符可确保维护代码的下一个人确切知道您的意思,而无需在每隔一行检查文件顶部,以便在撰写std::string
或mylib::string
时查看string
或using 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文件很好。您更喜欢标题中的第二种语法,因此您不会在整个项目中传播它们。