在大型库中使用和滥用命名空间

时间:2012-10-04 10:12:43

标签: c++ coding-style namespaces

我目前正在思考什么可以让我的(合理的)大型库看起来不太胖,而且一些贡献者建议使用几个命名空间来分类。

虽然我理解需要为这个lib的用户说清楚,但我怀疑命名空间是一个合适的解决方案,因为它使得编写代码更加冗长,例如:

namespace1::namespace2::namespace3::SomeClass myObject* = new namespace1::namespace2::namespace3::SomeClass();

社区中这个c ++功能的一般用途是什么?

整个库的单个命名空间+类的命名约定,或者doxygen docs中的\ addtosection会更好吗?

3 个答案:

答案 0 :(得分:2)

  

整个库的单个命名空间会是什么?

命名空间的主要目的是避免类似符号名称的问题以及由此产生的符号名称冲突 为你的库和一个有意义的指示性类名创建一个名称空间要好得多。这样做的目的是避免名字条款,也不会太笨拙。

你可以随时使用,

如果您有嵌套的命名空间,无论出于何种原因都无法避免。

答案 1 :(得分:1)

深度名称空间级别可以通过名称空间别名完成,所以我不会考虑这个问题。对于使用模块名称为类名添加前缀的命名约定,这也是您无法做到的。

我认为doxygen中的组织与实际命名正交。如果您的代码没有明确的包含依赖关系,那么doxygen组就是您的选择。否则,我以doxygen页面的形式提供文件级文档和文件层次结构的指南。这样我就不需要手动分组,并且可以同时检查我的包含。

答案 2 :(得分:0)

这是Boost使用的方法。但Boost是库的集合,每个库都位于自己的命名空间内。

在内部函数中,您可以使用using指令在需要时稍微减轻一些内容,例如using namespace std::placeholdersusing std::placeholders::_1

或者您可以使用命名空间别名:namespace ns = name1::name2::name3

最好的整体实际上是制作几个小的独立库,它们对彼此做出很少的假设,并给它们一个不同的命名空间。如果无法做到这一点,您可能需要查看一般设计。