关于c ++:名称空间,标题和对象的层次结构


Hierarchy of namespaces, headers and objects

据我所知,命名空间std包含所有C ++标准库,其中一个标准库是iostream,它有cout和cin对象。

1
2
3
4
5
std namespace
       |
   iostream
       |
   cout, cin

以上结构是否正确? 或者它有什么不同?


当您假设标准库中的所有内容都包含在std命名空间中时,您是正确的,除了少数例外,根据标准中的17.6.1.1/§3:

All library entities except macros, operator new and operator delete are defined within the namespace std or namespaces nested within namespace std. It is unspecified whether names declared in a specific namespace are declared directly in that namespace or in an inline namespace inside that namespace.

然后,当你说"图书馆"时,这里只有一个图书馆,即"标准图书馆"。 iostream是此库的标题。但这并不意味着标题中的所有内容都在特定的命名空间中。

例如,cincout直接位于std名称空间中,但包含在标头中。


From what I understand, the namespace std contains all of C++ standard
libraries, and one of the standard libraries is the iostream and it
has the functions cout and cin.

不完全的。

  • 虽然几乎所有的标准库都在命名空间std中,但是当使用旧的头形式(而不是)和assert宏时,我们还有std之外的C组件,没有范围。
  • std::cinstd::cout不是函数而是对象。
  • 只是标题的名称,其中包含C ++ ISO标准正式命名为"输入/输出库"的部分内容(std::iostreamstd::basic_iostream类很少使用的typedef)。
  • 库的某些组件可以通过不同的#include引入。例如,std::initializer_list可通过或通过包含类似获得。

没有太多细节,头文件和作用域是C ++中的两个正交概念。换句话说,它们彼此平行存在。它们之间/之间没有有用的层次结构。