如何/在哪里定义C ++命名空间std(链接到文档/标准)

时间:2017-01-08 19:12:05

标签: c++ c++14

这个问题似乎曾多次被问过,但答案只是围绕这个问题而言是poo-poo或pee-pee。我想在官方文档和标准中找到解决此问题的来源。显然,#stlude中包含的文件暗示了“std”。这是否意味着在任何地方都没有明确的“namespace std {...}”,而“std”就像一个关键字?我想知道这个关键字的官方定义。我想知道“std”中包含的内容和内容,使用显式“命名空间名称”的常规命名空间定义未涵盖的所有内容

5 个答案:

答案 0 :(得分:3)

  

[contents] / 2 除了宏operator newoperator 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显然不是暗示。

  

我想在官方文档和标准中找到一个来源   这个问题已得到解决。

祝你好运。

我怀疑在某个时候,语言作者同意(以某种方式)这个命名空间名称将是“标准”。而不是其他东西...可能会有一封信或者可能会有关于这个问题的会议记录?