c++ - using namespace std 的排序;包括?

标签 c++ language-lawyer using-directives

我最近在 C++ 项目的源文件中看到这段代码:

using namespace std;
#include <iostream>

忽略所有关于拥有 using namespace std 是否是个好主意的问题上面的代码是否合法?这两行之前的文件中没有代码。

我原以为这不会编译,因为 namespace std直到 #include <iostream> 才在范围内声明指令将其包含到文件中,但是使用项目的构建系统编译就可以了。如果有人链接到规范的相关部分,将不胜感激。

最佳答案

一个可能很有趣的数据点。当我编译以下内容时:

using namespace std;
using namespace no_such_namespace;

使用 g++ 4.5.2,我得到:

c.cpp:2:17: error: ‘no_such_namespace’ is not a namespace-name
c.cpp:2:34: error: expected namespace-name before ‘;’ token

需要说明的是,这两行是我编译的整个源文件。

此时 stdno_such_namespace 都没有被定义为命名空间,但 g++ 只提示第二个。我认为在没有声明的情况下,标识符 std 没有任何特别之处。我认为@James Kanze 是正确的,这是 g++ 中的错误。

编辑:And it's been reported. (5 年前!)

更新:现在已经超过 8 年了,仍然没有分配给任何人,更不用说修复了。 g++ 4.9.2 出现了这个问题。 clang++ 3.5 没有,但它对 std 发出警告,对 no_such_namespace 发出 fatal error :

c.cpp:1:17: warning: using directive refers to implicitly-defined namespace 'std'
using namespace std;
                ^
c.cpp:2:17: error: expected namespace name
using namespace no_such_namespace;
                ^
1 warning and 1 error generated.

更新:截至 2021 年 9 月 24 日,错误报告仍处于打开状态,该错误存在于 g++ 11.2.0 中。 2021-07-24 发布的评论建议 g++ 应该对此发出警告。

关于c++ - using namespace std 的排序;包括?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6841130/

相关文章:

c++ - 不能将结构用作 map 的索引

c++ - 如果没有对它的常量引用,临时对象会被删除吗?

c - C99中 "arithmetic operation"的定义是什么?

c# - 在 C# 和 VS2012 中,如何找到使用特定 "using"指令的所有行?

c++ -::socket 返回 0 并且::connect 将 errno 设置为 EBADF

c++ - 回声打印实现

c++ - 不合格的名称查找 : Why local declaration hides declaration from using directive

c - 指向不同对象的指针的相等性比较

c++ - "using"命名空间和声明命名空间有什么区别?