Home Articles

名称空间, Headers 和对象的层次结构

Asked
Viewed 744 times
0

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

std namespace 
       |
   iostream
       |
   cout, cin

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

2 Answers

  • 1

    根据我的理解,命名空间std包含所有C标准库,其中一个标准库是iostream,它具有cout和cin功能 .

    不完全的 .

    • 虽然几乎所有的标准库都在命名空间 std 中,但是当使用旧的头形式( <stdio.h> 而不是 <cstdio> )时,我们还有 std 之外的C组件,以及没有作用域的 assert 宏 .

    • std::cinstd::cout 不是函数而是对象 .

    • <iostream> 只是 Headers 的名称,其中包含C ISO标准正式命名的部分"Input/output library"( std::iostreamstd::basic_iostream<char> 类很少使用的 typedef ) .

    • 库的某些组件可以由不同的 #include 拉入 . 例如, std::initializer_list 可通过 <initializer_list> 或通过 <vector> 等包含 .

    在没有详细介绍的情况下,头文件和作用域是C中的两个 orthogonal 概念 . 换句话说,它们彼此平行存在 . 它们之间/之间没有有用的层次结构 .

  • 1

    如果您认为标准库中的所有内容都包含在 std 命名空间中,并且有一些例外,那么您是正确的,根据标准中的17.6.1.1/§3:

    除了宏,operator new和operator delete之外的所有库实体都在命名空间std中嵌套的名称空间std或名称空间中定义 . 未指定在特定名称空间中声明的名称是直接在该名称空间中声明还是在该名称空间内的内联名称空间中声明 .

    然后,当你说"the libraries"时,这里只有一个库,"standard library" . iostream 是此库的 Headers . 但这并不意味着 Headers 中的所有内容都在特定的命名空间中 .

    例如, cincout 直接位于 std 命名空间中,但包含在 <iostream> 标头中 .

Related