C+中未命名名称空间的使用+; 何时在C++中使用未命名的命名空间?它在任何意义上都比独立函数好吗?另外,是否应该只在源文件中使用,而不在头文件中使用?

C+中未命名名称空间的使用+; 何时在C++中使用未命名的命名空间?它在任何意义上都比独立函数好吗?另外,是否应该只在源文件中使用,而不在头文件中使用?,c++,namespaces,C++,Namespaces,它用于名称隐藏。每个未命名的命名空间都是唯一的。该链接更详细地解释了这一点。它通常在源文件中用于隐藏只应具有内部链接的函数(例如,不暴露于外部世界).未命名名称空间是翻译单元的专用名称空间,可用于屏蔽在不同翻译单元中出现的同名全局变量和函数,以避免出现链接冲突 例如,您需要一个仅在.cpp文件中定义并仅在该文件中使用的类。您想将其称为CModuleLock。如果它不在一个未命名的名称空间中,而另一个.cpp文件意外地有另一个类CModuleLock不在一个未命名的名称空间中,您将无法链接您的程序

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

未命名名称空间是翻译单元的专用名称空间,可用于屏蔽在不同翻译单元中出现的同名全局变量和函数,以避免出现链接冲突


例如,您需要一个仅在.cpp文件中定义并仅在该文件中使用的类。您想将其称为
CModuleLock
。如果它不在一个未命名的名称空间中,而另一个.cpp文件意外地有另一个类
CModuleLock
不在一个未命名的名称空间中,您将无法链接您的程序。

根据Stroustrup的说法,您应该在旧C中创建
静态
全局变量的地方使用它。其思想是,所讨论的项可以是它们所在的源文件的“全局”项,但不会污染编译中任何其他源文件的名称空间

换句话说,您不应该在C++中创建
static
globals。您应该改用未命名的名称空间


我发现有些情况下它们在头文件中很有用,但这种情况应该很少。大多数情况下,我认为应该声明可丢弃的异常。在这种情况下,所讨论的定义对于包含该头的所有内容都是全局的,但对于不包含该头的内容则不是全局的。

未命名名称空间是全局静态变量和函数的“C++版本”。请注意,您也可以为类使用未命名的命名空间。

基本上,命名空间解决了同名类、标识符和函数之间的冲突。有关详细信息,请单击下面给出的链接

另请参见本主题:
静态
在最新一期FCD(n3225)中不再标记为已弃用。委员会认识到,对于单个功能或全局功能来说,它不太冗长。“grep”也更容易,因为它出现在声明附近,并且不需要解析器。@Matthieu:但是函数有内部链接。未命名名称空间被称为“高级”的真正原因是它们“隐藏”符号,而不是更改对象/函数的链接,这与人们在使用它时通常希望实现的目标更接近。这在C++0x中没有改变,他们已经认识到(1)如果您担心外部链接会很昂贵,那么您需要内部链接,这反过来意味着您需要
静态的
,并且(2)由于C兼容性,在这种情况下,他们永远不会删除
静态的
,因此,反对它是一种空洞的威胁。@Steve:我原以为它也会改变链接,如果没有人知道符号,那么在外部维护它的目的是什么?@Matthieu:在C++03中,将其用作模板参数是合法的。我认为C++0x使在模板中使用内部链接变得合法,我可能错了。我有点忘记了我们应该讨论的是函数还是对象,不过…@SteveJessop:如果你担心外部链接会很昂贵,那么你需要内部链接,这反过来意味着你需要C++11的静态(§3.5/4)未命名的名称空间似乎具有内部链接,如
static
。我有时会对可能是私有内部类的类使用未命名的名称空间,但我希望在类似类之间共享(可能是实现相同概念的类)。当然,如果类变得足够通用,我会将它移动到一个命名的名称空间链接断开链接断开