使用命名空间std的排序; 包括?

tem*_*def 10 c++ using-directives language-lawyer

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

using namespace std;
#include <iostream>
Run Code Online (Sandbox Code Playgroud)

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

我原本以为这不会编译,因为namespace std#include <iostream>指令将其包含到文件中之前尚未在范围中声明,但是使用项目的构建系统,这编译得很好.如果某人有指向规范相关部分的链接,那将非常感激.

Kei*_*son 6

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

using namespace std;
using namespace no_such_namespace;
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

那时既std没有no_such_namespace被定义为命名空间,也没有被定义为命名空间,但g ++只抱怨第二个.在没有声明的情况下,我认为标识符std没有什么特别之处.我认为@James Kanze是正确的,这是g ++中的一个错误.

编辑:据报道.(5年前!)

更新:现在已超过8年,仍未分配给任何人,更不用说固定了.g ++ 4.9.2表明了这个问题.clang ++ 3.5没有,但它会发出警告std并发出致命错误no_such_namespace:

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.
Run Code Online (Sandbox Code Playgroud)