在C++中使用未命名的命名空间

Ash*_*sha 68 c++ namespaces

何时在C++中使用未命名的命名空间?在任何意义上它比独立功能更好吗?是否应该仅在源文件中使用而不在头文件中使用?

T.E*_*.D. 60

根据Stroustrup的说法,你应该在老C的地方使用它来制作static全局变量.这个想法是有问题的项目可以是它们所在源文件的"全局",但不会污染编译中任何其他源文件的命名空间.

换句话说,您不应该static在C++中创建全局变量.您应该使用未命名的命名空间.

我发现了一些在头文件中有用的情况,但这种情况应该很少见.我认为主要用于声明可抛出的异常.在这种情况下,所讨论的定义对于#include该标题的所有内容都是全局的,但对于那些没有的内容则不是.

  • @Matthieu:但是这些功能有内部联系.未命名的命名空间被称为"优越"的真正原因是它们"隐藏"符号而不是改变对象/函数的链接,这与人们在使用时通常想要实现的内容更加匹配.这在C++ 0x中没有改变,他们已经认识到(1)如果你担心外部链接会很昂贵,那么你需要内部链接,这反过来意味着你想要`静态`,和(2)他们由于C的兼容性,在这种情况下永远不会删除`static`,所以弃用它是一个空洞的威胁. (6认同)
  • @SteveJessop:如果您担心外部链接会很昂贵,那么您需要内部链接,这反过来意味着您需要static_使用C++ 11(§3.5/ 4)未命名的命名空间似乎具有内部链接,如`static`. (3认同)
  • 在最新一期的FCD(n3225)中,`static`不再被标记为已弃用.委员会认识到,对于单一职能或全球职能而言,它的冗长程度较低.它也更容易"grep",因为它出现在声明附近,并且不需要解析器. (2认同)
  • @Steve:我期待它也改变联系,如果没有人知道这个符号,那么将它保持在外部的目标是什么? (2认同)

sha*_*oth 27

未命名的命名空间对于翻译单元是私有的,这可以用于屏蔽在不同翻译单元中出现的具有相同名称的全局变量和函数,从而不会出现链接冲突.

例如,您需要一个只在.cpp文件中定义并仅在该文件中使用的类.你想打电话给它CModuleLock.如果它不在未命名的命名空间中,并且某些其他.cpp文件意外地具有CModuleLock不在未命名的命名空间中的另一个类,则您将无法链接您的程序.


Jef*_*ter 10

它用于名称隐藏.每个未命名的命名空间都是唯一的.这里的链接更详细地解释.它通常用在源文件中,以隐藏只应具有内部链接的函数(例如,不暴露给外部世界).