c ++ 11中的命名空间问题?

Tom*_*lny 8 c++ gcc glibc c++11

有人可以解释一下:

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

对于C++ 11模式,div符号是否也不应该在std命名空间中?或者它是我的系统特有的东西?

Xeo*_*Xeo 4

\n

/usr/include/stdlib.h

\n
\n

中的每个名字.h驻留在全局命名空间中(显然)。

\n

此外,任何C++ stdlib头cHEADER文件都会定义相应的名称HEADER.hstd,但也允许将它们放在全局命名空间中(因此它们可以这样做

\n
// cHEADER\n#include <HEADER.h>\n\nnamespace std{\nusing ::one_name_from_HEADER;\nusing ::another_name_from_HEADER;\n// and so on...\n}\n
Run Code Online (Sandbox Code Playgroud)\n

并完成它)。

\n

\xc2\xa7D.5 [depr.c.headers]

\n
\n

p2 每个 C 头文件都有一个形式为 的名称name.h,其行为就好像每个名称都由相应的名称空间放置在标准库命名空间中一样。cname头文件放置在标准库名称空间中的每个名称都放置在全局名称空间范围内一样。未指定这些名称是否首先在命名空间 std 的命名空间范围 (3.3.6) 内声明或定义,然后通过显式 using 声明 (7.3.3) 注入全局命名空间范围。

\n

p3 [示例:标头<cstdlib>确实在命名空间 std 中提供其声明和定义。它还可以在全局命名空间内提供这些名称。标头<stdlib.h>确实在全局命名空间内提供了相同的声明和定义,就像 C 标准中一样。它还可以在命名空间 std 中提供这些名称。\xe2\x80\x94结束示例]

\n
\n

正如您所看到的,反过来也是如此(<HEADER.h>可能会向命名空间引入名称std,就好像

\n
// HEADER.h\n#include <cHEADER>\n\nusing std::one_name_from_HEADER;\nusing std::another_name_from_HEADER;\n// and so on...\n}\n
Run Code Online (Sandbox Code Playgroud)\n

),这使得这些标头之间的整体区别相当......毫无用处,真的。

\n