什么时候会在 C++ 中使用未命名的命名空间?它在任何意义上都比独立功能更好吗?另外,它应该只在源文件中使用而不是在头文件中吗?
根据 Stroustrup 的说法,您应该在旧 C 中创建
static
全局变量的地方使用它。这个想法是,有问题的项目对于它们所在的源文件来说可以是“全局”的,但不会污染编译中任何其他源文件的命名空间。
换句话说,你不应该在C++中创建
static
全局变量。您应该改用未命名的命名空间。
我发现在某些情况下它们在头文件中很有用,但这应该很少见。我主要认为是声明可抛出异常。在这种情况下,所讨论的定义对于
#include
是该标头的所有内容都是全局的,但对于不是标头的内容则不是。
未命名命名空间是翻译单元私有的,这可以用来屏蔽不同翻译单元中出现的同名全局变量和函数,这样就不会出现链接冲突。
例如,您需要一个仅在 .cpp 文件中定义并仅在该文件中使用的类。你想称它为
CModuleLock
。如果它不在未命名的命名空间中,并且其他某个 .cpp 文件意外地具有另一个类 CModuleLock
不在未命名的命名空间中,您将无法链接您的程序。
它用于隐藏名称。每个未命名的命名空间都是唯一的。链接here有更详细的解释。它通常在源文件中用于隐藏只应具有内部链接的函数(例如不暴露给外界)。
未命名命名空间是全局静态变量和函数的“C++ 版本”。请注意,您还可以对类使用未命名的命名空间。