这个问题似乎曾多次被问过,但答案只是围绕这个问题而言是poo-poo或pee-pee。我想在官方文档和标准中找到解决此问题的来源。显然,#stlude中包含的文件暗示了“std”。这是否意味着在任何地方都没有明确的“namespace std {...}”,而“std”就像一个关键字?我想知道这个关键字的官方定义。我想知道“std”中包含的内容和内容,使用显式“命名空间名称”的常规命名空间定义未涵盖的所有内容
答案 0 :(得分:3)
[contents] / 2 除了宏
operator new
和operator delete
之外的所有库实体都在命名空间std
中定义,或者命名空间嵌套在命名空间{{1}中}} ...
答案 1 :(得分:2)
不,#include
不以任何方式隐含。你为什么这么认为?
我刚刚在我的MinGW-w64(GCC)设置中打开了iostream
文件,并且很容易找到
namespace std
线。
我假设大多数(如果不是全部)编译器也明确定义了这个命名空间。
答案 2 :(得分:0)
std就像其他所有命名空间一样:
namespace mynamespace {
struct test {};
}
mynamespace::test
使用Visual Studio时,定义了:
_STD_BEGIN // equal to namespace mynamespace {
struct IAmInNameSpaceStd {};
_STD_END // equal to }
你会在每个属于STL的头文件中找到类似的内容。
在VS 2013上,定义写在文件yvals.h 523-524:
中#define _STD_BEGIN namespace std {
#define _STD_END }
如果您打开例如iostream,您现在可以找到:
_STD_BEGIN
或
namespace std {
或与其他编译器别的东西。但不管怎样,它都写在那里。没有魔法参与。
答案 3 :(得分:0)
整个std命名空间未在一个特定的源/头文件中定义。
命名空间已打开,这意味着您可以添加它们。
标准c ++库中的每个头文件都将其特定内容添加到std
命名空间。
例如:
#include <vector> will add the vector's related bits.
答案 4 :(得分:0)
命名空间std并不暗示。
在我的Ubuntu上,我可以转到目录
/usr/include/c++/5,
并执行
grep --color -nH -e namespace *
发现超过200次。快速扫描建议一半是声明,一半是注释(在块的末尾),就像在最后两个文件中一样:
utility:77:namespace std _GLIBCXX_VISIBILITY(default)
utility:268:} // namespace
valarray:44:namespace std _GLIBCXX_VISIBILITY(default)
valarray:87:} // namespace
valarray:92:namespace std _GLIBCXX_VISIBILITY(default)
valarray:585:} // namespace
valarray:594:namespace std _GLIBCXX_VISIBILITY(default)
valarray:1233:} // namespace
此目录中有大约10个(子)目录。我曾多次访问过的是&#39; bit&#39;
/usr/include/c++/5/bits
此目录还有大约200个命名空间std的使用,以及一些其他命名空间(即不是std)。
因此,在两次grep工作中,我可能已经找到了大约200个对std命名空间的贡献。命名空间std显然不是暗示。
祝你好运。我想在官方文档和标准中找到一个来源 这个问题已得到解决。
我怀疑在某个时候,语言作者同意(以某种方式)这个命名空间名称将是“标准”。而不是其他东西...可能会有一封信或者可能会有关于这个问题的会议记录?