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


Answers:


63

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

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

我发现在某些情况下它们在头文件中很有用,但是这种情况很少见。我通常认为是要声明可抛出的异常。在那种情况下,所讨论的定义将是针对#include该标头的所有内容的全局定义,而不是针对不包含此内容的所有内容的全局定义。


3
static在最新版的FCD(n3225)中不再被标记为已弃用。该委员会认识到,对于单个职能或全球职能而言,它的冗长程度较低。“ grep”也更容易,因为它出现在声明附近,并且不需要解析器。
Matthieu M.

6
@Matthieu:但是这些函数具有内部链接。未命名的命名空间被称为“高级”的真正原因是它们“隐藏”了符号,而不是更改对象/函数的链接,这与人们通常希望在使用它们时实现的目标更加接近。这在C ++ 0x中没有改变,他们已经认识到(1)如果您担心外部链接会很昂贵,那么您想要内部链接,这反过来又意味着您想要static;以及(2)他们永远不会static由于C兼容性,在这种情况下将其删除,因此弃用它是一个空洞的威胁。
史蒂夫·杰索普

2
@Steve:我期望它也能改变链接,如果没人知道符号,将它保持在外部的目的是什么?
Matthieu M.

@Matthieu:在C ++ 03中,使其合法用作模板参数。我认为C ++ 0x使在模板中使用内部链接的东西合法,我可能是错的。不过,我有点忘记了我们是否应该谈论功能或对象...
Steve Jessop

3
@SteveJessop:如果您担心外部链接会很昂贵,那么您需要内部链接,这反过来又意味着您想要静态对于C ++ 11(§3.5/ 4),未命名的名称空间似乎具有内部链接,例如static
legends2k

28

未命名的名称空间是转换单元的私有属性,可用于屏蔽在不同转换单元中出现的具有相同名称的全局变量和函数,因此不会发生链接冲突。

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


1
有时,我对可能是私有内部类的类使用未命名的名称空间,但是我想在相似的类之间共享(也许那些实现相同概念的类)。当然,如果该类变得足够通用,我将其移至命名命名空间
RichardBruce


1

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.