2011-03-15 43 views
63

何时会使用C++中的未命名命名空间?在任何意义上而不是独立职能都更好?另外,它只能用于源文件而不用于头文件吗?C++中未命名命名空间的使用

+2

给出的链接,请参阅本主题也:?具名命名空间的静态以上优势( http://stackoverflow.com/questions/4422507/superiority-of-unnamed-namespace-over-static) – Nawaz

回答

57

据Stroustrup的,你应该在在旧的C,你会作出static全局的地方使用它。这个想法是,所讨论的项目可以对它们所在的源文件是“全局”的,但不会污染编译过程中任何其他源文件的命名空间。

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

我发现他们是在头文件中有用的一些情况,但应该是罕见的。大多数情况下,我认为是为了声明可抛出的异常。在那种情况下,所讨论的定义对于所有标题都是全球性的,但不适用于那些不适用的东西。

+2

在最新一期的FCD(n3225)中'static'不再被标记为弃用。该委员会认识到,对于单一职能或全球而言,它不那么冗长。 “grep”也更容易,因为它出现在声明附近,并且不需要解析器。 –

+6

@Matthieu:但这些功能都有内部联系。无名命名空间被称为“优越”的真正原因是它们“隐藏”符号而不是改变对象/函数的链接,这与人们通常在使用它时想要实现的内容更接近。这在C++ 0x中没有改变,他们已经认识到(1)如果你担心外部链接会很昂贵,那么你需要内部链接,这反过来意味着你想要'静态',和(2)他们由于C兼容性,在这种情况下永远不会删除'static',所以贬低它是一个空洞的威胁。 –

+2

@Steve:我期待它也改变了联系,如果没有人知道符号,维持它的目标是什么? –

8

它用于名称隐藏。每个未命名的名称空间都是唯一的。链接here更详细地解释。它通常用于源文件中以隐藏仅应该具有内部链接的功能(例如,不暴露于外部世界)。

25

具名命名空间是私有的翻译单元,这可以用来屏蔽全局变量和函数在不同的翻译单元中出现的,这样没有链接发生冲突相同的名称。

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

+0

我有时使用未命名空间的类,可能是私有的内部类,但我想类似的类之间共享(也许那些实施相同概念的人)。当然,如果这个类变得足够普遍,我将把它移动到一个命名的命名空间 – RichardBruce

1

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