什么是c ++模块,它们与命名空间有何不同?

时间:2012-03-19 03:01:38

标签: c++

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

我有多个问题

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

  2. 什么是模块以及它与名称空间的区别。

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

  4. 开发人员通常会将其源代码划分为大型项目的模块吗?

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

2 个答案:

答案 0 :(得分:2)

您在文档中看到的模块是由Doxygen创建的,不是C ++的一部分。 libstdc ++库中的某些类使用\ ingroup Doxygen命令组合成模块。

有关在Doxygen中创建模块/组的更多信息,请参阅:http://www.doxygen.nl/manual/grouping.html

答案 1 :(得分:2)

在我看来,你遇到了两个完全不同的东西,碰巧使用相同的名字。

您在文档中看到的“模块”似乎只是算法等的事后分类。它可能是公开的,它们应该与命名空间紧密对应,但在标准库的情况下,基本上所有东西都在一个巨型命名空间中。如果从一开始就使用命名空间设计它可能不是那样,但事情并非如此。在任何情况下,分类都适用于文档,而不适用于代码本身。产生类似文档的其他人可能决定将其划分为不同的模块,仍然不会影响代码。

在C ++ 11标准化工作期间,有人建议在C ++语言本身添加其他东西(也是名称模块)。该提案被删除,主要是为了尽快完成标准。后者与名称空间的区别很大,并且是使用“export”作为模块名称的名称空间。它虽然已经消失了(现在最少),所以我不会在这里详细介绍它。如果你很好奇,你可以阅读Daveed Vandervoorde's paper