C++:在#include<headerxy>之前使用"using namespace xyz"会发生什么?

3

我听说在 "#include" 之前使用 "using namespace xy" 是严格禁止的。例如:

可能是重复问题:
使用命名空间 std; 和头文件的顺序?

这个规定是有原因的,因为一些头文件可能会定义与命名空间相同的名称,导致编译错误。更好的做法是只在需要时使用特定的名称,而不是在整个程序中都使用命名空间。

#include <iostream>

using namespace std;

int main() {
...
}

什么是技术原因呢?我尝试了以下操作,没有任何问题:
using namespace std;

#include <iostream>

int main() {
....
}

你从哪里听到的?他们提供了什么样的理由吗?我想不出任何理由。 - n. m.
不同意,因为 std:: 是一个特殊情况,而这个问题更广泛。 - MSalters
3个回答

3

不,这并不是强制禁止的(否则它将是编译或预处理错误)。

using关键字将所有函数和变量放入当前命名空间中,因此在头文件中使用它是不鼓励的。


1
+1 是因为在头文件中使用它是不鼓励的,但在 .cpp 文件中使用它是可以的(并非总是不良实践)。 - iammilind

3
我能想到一个很好的理由,那就是如果命名空间还没有被声明,那么这个语句是非法的。至少按照我对标准的理解是这样的;大多数编译器似乎把using指令(using namespace name;)看作是命名空间的声明,尽管我找不到标准中任何支持这一点的内容。
更一般地说,最好尽可能避免使用命名空间指令,除非在非常有限的范围内(我永远不会为std使用命名空间指令,因为其中包含太多的内容)。

2
技术原因是using只会将当前可见的内容导入到当前命名空间中。
如果在using之后包含一个文件,就会引入“奇怪”的顺序依赖关系。当然,这可能是你想要的,所以语言并没有禁止它。但是,你实际上改变了在using之后包含的头文件的含义,因为你将头文件暴露给了不同的上下文(并且名称查找可能会发现其他名称,具体取决于上下文)。名称查找规则有时可能很微妙,你不想在别人的代码中引入微妙之处。
在书籍《C++编程规范》(Sutter, Alexandrescu)第59章中有一个很好的讨论:“不要在头文件或#include之前写命名空间使用”。

1
这适用于using声明,但不适用于using指令,这是正在讨论的内容。 "对于每个使用指令(7.3.4)提名成员的命名空间,成员的潜在作用域包括使用指令的潜在作用域中跟随成员声明点的部分。" 名称在使用指令之前不必在作用域内。 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接