当使用匿名命名空间时,如果它嵌套在另一个命名空间中会有任何问题吗?例如,在以下代码中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 :(得分:30)
匿名命名空间可以被视为具有您不知道的唯一名称的普通命名空间。根据C ++标准7.3.1.1:
unnamed-namespace-definition的行为就像它被
替换一样namespace unique { /* empty body */ } using namespace unique; namespace unique { namespace-body }
其中翻译单元中所有出现的唯一标识都被相同的标识符替换,并且此标识符与整个程序中的所有其他标识符不同。
没有其他问题。
答案 1 :(得分:3)
对于您的目的,可能没有真正的区别。它对cpp文件中privateFunction
的可见位置有所不同。如果将void barFunc() { privateFunction(); }
添加到两个文件的末尾,则Foo2.cpp将编译,而Foo1.cpp则不会。
通常,您不会在同一个cpp文件中定义来自许多不同命名空间的外部符号,因此不会出现差异。