我刚刚加入了一个新的 C++ 软件项目,我正在尝试了解该设计。该项目经常使用未命名的命名空间。例如,类定义文件中可能会出现这样的情况:
// newusertype.cc namespace { const int SIZE_OF_ARRAY_X; const int SIZE_OF_ARRAY_Y; bool getState(userType*,otherUserType*); } newusertype::newusertype(...) {...
可能导致使用未命名命名空间的设计注意事项有哪些?有什么优点和缺点?
未命名的命名空间是一种使标识符翻译单元本地化的实用程序。它们的行为就像您为命名空间的每个翻译单元选择一个唯一名称:
namespace unique { /* empty */ } using namespace unique; namespace unique { /* namespace body. stuff in here */ }
使用空主体的额外步骤很重要,因此您已经可以在命名空间主体中引用在该命名空间::name中定义的标识符,因为 using 指令已经发生。
::name
这意味着您可以拥有(例如)help可以存在于多个翻译单元中的自由函数,并且它们不会在链接时发生冲突。效果几乎与使用staticC 中使用的关键字相同,您可以将其放入标识符的声明中。未命名的命名空间是一个更好的选择,甚至可以使类型转换单元成为本地的。
help
static
namespace { int a1; } static int a2;
两者a都是本地翻译单元,不会在链接时发生冲突。但不同的是,a1匿名命名空间中的 获得了唯一的名称。
a
a1