【问题标题】:Why headers when there are namespaces?有名称空间时为什么要使用标头?
【发布时间】:2016-02-24 09:15:09
【问题描述】:

标准 C++ 库的所有实体(变量、类型、常量和函数)都在 std 命名空间中声明。

Namespaces

现在,如果所有内容都在 std 命名空间中“声明”,那么为什么会有这些花哨的标头?

已经检查过this,但还不够有用。

【问题讨论】:

  • 两者没有任何关系……你的问题毫无意义。
  • @LightnessRacesinOrbit 那么为什么在标头中已经存在 std 命名空间中的声明呢?
  • 这没有任何意义。声明在词法上“在”标题中。那是他们住的地方。这是有人输入它们的地方,也是编译器在搜索它们时找到的文件。命名空间是一种语义分类,您的标头被包含后用于整理程序中的所有内容(来自标头或其他)。命名空间实际上只是您要声明的事物名称的一部分;而已。我真的不明白你在说什么。这就像在问“为什么我们需要不同的 HTML 标签,因为它们都已经在一个 HTML 文件中了?”
  • @LightnessRacesinOrbit 好的,对不起。由于字符串类是在<string> 标头中声明的,并且在 std 命名空间中声明了 'also',您能否说明一下声明在 std 命名空间中的样子?
  • 写完我的答案后,我现在认为您的问题与您链接的问题完全相同。什么是“不够有用”?

标签: c++ namespaces


【解决方案1】:

命名空间是一种组织类型的方式。将所有数学函数保存在 MyMath 命名空间等中。这也是一种分离类型的方法,这样它们就不会与其他类型发生冲突。因此,您的代码中可以同时包含 MyTypes::string 和 stl::string。 std 命名空间是 STL 为其内容选择的命名空间。

头文件包含代码的公共接口。它为您提供了可用的内容,它声明的类型和函数,并希望在 cmets 中提供有关如何使用它的文档。如果您尝试使用不包含相应头文件的代码,您的代码将无法编译,因为它找不到类型。标头可能包含也可能不包含命名空间中的代码。

【讨论】:

  • 头文件包含声明,命名空间也是如此,那不就是某种重新声明吗?
  • @ibrahim5253 命名空间是声明的部分。函数调用foo 是与std::foo 不同的函数(第二个是命名空间std 中的函数)。命名空间可以更轻松地减少名称冲突。
  • @ibrahim5253:“命名空间也是如此”不,不是真的。也许您可以对您认为这里发生的事情进行图形描述?
【解决方案2】:

您可能知道,当您在 b.cpp 中包含 #include "a.h" 之类的内容时,ah 中的所有内容都将被放置,而不是 中的 #include "a.h" b.cpp。因此,如果 a.h 是 200 行代码,而您的实际代码是 10 行代码,那么将要编译的代码将是大约 210 行代码。如果您的 a.h 很大或者您多次包含它,编译时间将会增加。(请注意,如果 a.h 中包含某些内容,则此故事会重复。)
假设std 库位于一个.h 文件和std 命名空间内。现在它真的很大了,在你要使用std 类之一的每个文件中,即使是最小的类,你也必须包含整个文件。它使您的程序非常大并且编译非常慢。

【讨论】:

    【解决方案3】:

    您拥有的 sn-p 是一项要求。头文件是其中标准库实体实际声明。由于标准库中包含的实体的大小和多样性,头文件不止一个。本质上,声明是根据功能分组的。

    【讨论】:

      【解决方案4】:

      标题和命名空间实际上是不相关的;一个与另一个没有任何关系。

      因此,一个也不会以任何方式使另一个过时。

      考虑一下您可能在<string> 中找到的std::string 声明:

      namespace std {
         typedef basic_string<char> string;
      }
      
      • 命名空间是由声明创建(和使用)的名称的分类;
      • 头文件是对在硬盘上存储声明的位置进行分类。

      没有任何“重新声明”,因为这两个概念是不相关的。

      【讨论】:

        猜你喜欢
        • 2020-11-24
        • 1970-01-01
        • 2016-09-18
        • 2011-03-20
        • 1970-01-01
        • 1970-01-01
        • 2017-01-28
        • 2014-11-23
        • 2015-02-10
        相关资源
        最近更新 更多