c++ - 什么是 C++ 模块,它们与 namespace 有何不同?

标签 c++

我在 http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01618.html 查看 libstdc++ 文档并发现它被安排在算法、字符串等“模块”中

我有很多问题

  1. 由于这是从 doxygen 自动生成的文档,libstdc++ 源代码或配置文件的哪一部分使 doxygen“知道”不同的模块及其内容/依赖项?

  2. 什么是模块,它与命名空间有何不同。

  3. 我对 c++ 模块进行了谷歌搜索,发现模块是由“export modulename”定义的,但我在 libstdc++ 源代码中找不到任何导出定义。上述文档中的“模块”一词是否指的是与 export 不同的结构?

  4. 开发人员通常会将他们的源代码分成大型项目的模块吗?

  5. 我在哪里可以了解模块,以便我可以将我的源代码组织到模块和命名空间中

最佳答案

在我看来,您遇到了两个完全不同的事物,但恰好使用相同的名称。

您在文档中看到的“模块”似乎只是算法等的事后分类。人们可能会争论说它们应该与命名空间紧密对应,但在标准库的情况下,基本上一切都在一个巨大的命名空间中。如果它从一开始就使用 namespace 进行设计,它可能不会那样,但事情并不是这样发生的。无论如何,分类适用于文档,而不适用于代码本身。制作类似文档的其他人可能会决定将其分成不同的模块,但仍然不会影响代码。

在 C++11 标准化工作期间,有人提议向 C++ 语言本身添加其他内容(也称为模块)。该提案已被删除,主要是为了尽快完成标准。后者与命名空间有很大不同,是使用“export”作为模块名称的命名空间。它已经死了(至少现在),所以我不会在这里详细介绍它。好奇的可以看Daveed Vandervoorde's paper关于它。

更新:委员会向 C++ 20 添加了模块。添加的内容至少与 2012 年提出这个问题时任何人都知道的有所不同,但它至少与模块的总体思路基本相同为 C++11 提出的。添加到 10 年前的答案有点多,但这里至少有一些关于它们的信息的链接:

https://en.cppreference.com/w/cpp/language/modules

关于c++ - 什么是 C++ 模块,它们与 namespace 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9764477/

相关文章:

c++ - 使用 bad_alloc 处理大 vector 会使程序崩溃

c++ - C++ 中的新功能 "synchronized" block 有什么优势?

C++,三元运算符操作数评估规则

c++ - 不再使用 QT OpenGL 了吗?

C++基于派生类的重载方法

c++ - IP到长转换c++

c++ - 你能在同一个 block 中的互斥体 lock_guard 之前有代码吗

c++ - 链接器提示找不到现有方法 (C++)

C++ 重新定义'..' 和之前在这里声明的错误

c++ - 如何轻松应用Crypto++哈希函数?