C++ 嵌套的未命名命名空间?
使用未命名的命名空间时,如果它嵌套在另一个命名空间中,是否存在任何问题?例如,Foo1.cpp和Foo2.cpp在以下代码中是否存在任何实际差异:C++ 嵌套的未命名命名空间?,c++,namespaces,unnamed-namespace,C++,Namespaces,Unnamed Namespace,使用未命名的命名空间时,如果它嵌套在另一个命名空间中,是否存在任何问题?例如,Foo1.cpp和Foo2.cpp在以下代码中是否存在任何实际差异: // Foo.h namespace Foo { void fooFunc(); } // Foo1.cpp namespace Foo { namespace { void privateFunction() { ... } } vo
// 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();
}
}
未命名名称空间可以被视为具有唯一名称(您不知道)的普通名称空间。根据C++标准7.3.1.1: 未命名的命名空间定义的行为就像它被替换为 翻译单元中出现的所有唯一标识符均替换为同一标识符,且该标识符不同于整个程序中的所有其他标识符
没有其他问题。对于您的目的来说,可能没有真正的区别。这会影响cpp文件中
privateFunction
的可见位置。如果将void barFunc(){privateFunction();}
添加到两个文件的末尾,则Foo2.cpp编译,而Foo1.cpp不编译
通常,您不会在同一cpp文件中定义来自许多不同名称空间的外部符号,因此不会出现差异。导出的符号将不同。看一看nm输出。只是为了学究,技术术语是
未命名命名空间
,而不是匿名。联合是匿名的,命名空间是未命名的。但是谁在乎呢:)虽然这个术语是未命名的
,但是如果你在工具下用nm
或gdb
检查,它将被称为匿名名称空间
,所以混淆是可以理解的。“两个文件的结尾都是名称空间Foo{}
之后的“意思”?@MikeC-是的,我想说@SteveJessop的意思是在名称空间Foo{}
namespace unique { /* empty body */ }
using namespace unique;
namespace unique { namespace-body }