【发布时间】:2012-10-13 22:58:37
【问题描述】:
谁能解释一下:
$ cat test.cpp
#include <string>
std::string div;
$ g++ -c test.cpp
$ g++ -std=c++11 -c test.cpp
test.cpp:2:13: error: 'std::string div' redeclared as different kind of symbol
In file included from /usr/include/c++/4.7.1/cstdlib:66:0,
from /usr/include/c++/4.7.1/ext/string_conversions.h:37,
from /usr/include/c++/4.7.1/bits/basic_string.h:2814,
from /usr/include/c++/4.7.1/string:54,
from test.cpp:1:
/usr/include/stdlib.h:787:14: error: previous declaration of 'div_t div(int, int)'
$
对于 C++11 模式,div 符号是否也应该位于 std 命名空间中?还是我的系统特有的东西?
【问题讨论】:
-
我发现编译器经常违反 C 标准库头文件的
c*对应对象定义的所有内容都必须在std命名空间中的规则。显然string包含cstdlib,这违反了规则并将div放在全局命名空间中。我会称之为编译器缺陷。 -
有趣的是它可以正常工作,直到我指定了 c++11 模式。我不确定它是否是编译器错误:clang 做了完全相同的事情......
-
@SethCarnegie - 库实现经常违反该规则的原因是没有这样的规则。在 C++03 中有,但这是一厢情愿的想法;它无法完成,并且在 C++11 中删除了该规则。
-
是否有任何标准方法可以防止这种冲突,而不必在每次使用时限定我的 div 变量?
-
@PeteBecker 这令人失望。我知道 C++11 允许它,但我希望实现不这样做。我从来没有意识到 C++03 实际上不允许 c 头文件污染全局命名空间,而且实现根本不符合要求。