2011-10-06 187 views
4

命名空间{INT美孚(INT A); }C++命名空间....匿名命名空间是合法的?

筛选。这段代码段合法吗?

这合法吗?而且,我可以在任何地方参考Foo吗?或只有某些域?

谢谢。

+0

[在静态具名命名空间的优势的可能重复?](http://stackoverflow.com/questions/4422507/superiority-of- unnamed-namespace-over-static) – Nawaz

+0

这是合法的,但意味着与常规名称空间不同。 :) – jalf

回答

8

这是合法的,您可以在同一个Translation Unit的任何地方使用Foo

匿名命名空间是说对变量static其范围限制在同一翻译单位的标准所规定的方式。

C++ 03标准节7.3.1.1未命名空间

第2段:

使用static关键字的命名空间中的范围声明对象时已被弃用,无名的命名空间提供了一个更好的选择


更新:
作为@Matthieu M.正确地指出中的注释和his answer的C++ 11标准从C++ 03标准,这意味着除去上述报价在命名空间范围内声明对象时不推荐使用static关键字,但匿名或未命名的名称空间仍然有效。

+0

我的答案略有不同,但更正确一点,我认为;) –

+0

@BjörnPollex:啊,这是我的第二次编辑使我们的答案相同lol –

+0

现在我们都添加了标准报价:) –

4

这是合法的。您可以在翻译单元的任何地方参考Foo

从C++ 03标准,第7.3.1.1:

一个未命名的名称空间定义的行为就好像它是由

namespace unique { /* empty body */ } using namespace unique; 
namespace unique { namespace-body } 

替换其中的unique所有出现 翻译单元由相同的标识符替换和本 标识符从在整个程序中所有其他标识符不同。

使用static关键字的在 一个命名空间声明范围的对象时不推荐使用; unnamed命名空间提供了一个优越的替代选项 。

+0

'unnamed-namespace-definition的行为就好像它被替换为...' 。我恳求在这里有所不同。如果没有命名'namespace',你可以在里面声明/定义一个变量。但是,如果命名空间不正常(因为它会导致多个符号链接器错误)。所以两者都没有相同的效果。 – iammilind

+3

@iammilind:由于所有翻译单元的“唯一”(这是该名称空间的名称)是不同的,因此永远不会有多重定义的符号。此外,这是一个标准的引用,所以如果你不同意,请与委员会讨论;) –

+0

好吧,我认为'unique'只是一个名字。我不知道标准委员会会把这种令人困惑的例子:))。可能是'命名空间 {...}使用命名空间;'会是适当的措辞。 – iammilind

2

定义略微在C++ 11标准改变:

7.3.1.1未命名空间[命名空间。无名]

1/一个未命名的名称空间定义的行为就好像它是由

inlineoptnamespace unique { /* empty body */ } 
using namespace unique ; 
namespace unique { namespace-body } 

其中内嵌出现替换当且仅当它出现在未命名-namespace-定义中,翻译单元中唯一的所有事件被相同的标识符替代,并且该标识符不同于整个程序中的所有其他标识符.94 [例如:

namespace { int i; } // unique ::i 
void f() { i++; } // unique ::i++ 

namespace A { 
    namespace { 
    int i; // A:: unique ::i 
    int j; // A:: unique ::j 
    } 
    void g() { i++; } // A:: unique ::i++ 
} 

using namespace A; 

void h() { 
    i++; // error: unique ::i or A:: unique ::i 
    A::i++; // A:: unique ::i 
    j++; // A:: unique ::j 
} 

末端示例]