我最近看到这个代码在 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
需要明确的是,这两行是我编译的整个源文件。
Neither std
nor no_such_namespace
此时已被定义为名称空间,但 g++ 仅抱怨第二个。我不think标识符有什么特别之处std
在没有声明的情况下。我认为@James Kanze 是对的,这是 g++ 中的一个错误。
EDIT: 并且已经报道过。 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29556(5年前!)
更新:现在已经八年多了,仍然没有分配给任何人,更不用说修复了。 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.
更新:截至 2021 年 9 月 24 日,错误报告仍处于开放状态,并且该错误存在于 g++ 11.2.0 中。 2021 年 7 月 24 日发布的评论建议 g++ 应对此发出警告。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)