2010-01-19 124 views
26

使用匿名命名空间时,如果它嵌套在另一个命名空间中,是否存在任何问题?例如,是否有下面的代码Foo1.cpp和Foo2.cpp之间的真正区别:嵌套的匿名命名空间?

// Foo.h 
namespace Foo 
{ 
    void fooFunc(); 
} 

// Foo1.cpp 
namespace Foo 
{ 
    namespace 
    { 
     void privateFunction() 
     { 
      ... 
     } 
    } 

    void fooFunc() 
    { 
     privateFunction(); 
    } 
} 

// Foo2.cpp 
namespace 
{ 
    void privateFunction() 
    { 
     ... 
    } 
} 

namespace Foo 
{ 
    void fooFunc() 
    { 
     privateFunction(); 
    } 
} 
+0

导出的符号将有所不同。看看nm输出。 – 2010-01-19 14:41:56

+2

只是迂腐,技术术语是'匿名命名空间',不是匿名的。 – GManNickG 2010-01-19 14:46:37

+0

工会是匿名的,名字空间是未命名的。但谁在乎:) – 2010-01-19 14:55:21

回答

26

匿名命名空间可以被视为具有独特的名字,你不知道一个正常的命名空间。根据C++标准7.3.1.1:

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

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

其中在翻译单元的独特所有出现由相同的标识符替换和代替该标识符与整个程序中的所有其他标识符不同。

没有其他问题。

3

可能没有真正的区别为您的目的。它在您的cpp文件privateFunction可见的位置有所不同。如果将void barFunc() { privateFunction(); }添加到两个文件的末尾,则Foo2.cpp编译并且Foo1.cpp不会。

通常情况下,你不会在同一个cpp文件中定义来自许多不同命名空间的外部符号,所以不会出现差异。