在大型项目开发中,通常有多人协同开发,划分成各个小组负责不同的模块,模块之间相对独立。代码中定义了许多类名、函数名、模板名,甚至一些全局变量。如果不对这些名称加以规范,很容易造成名字的冲突,也称为命名空间污染。为了避免这个问题,C++标准引入了命名空间的概念,将不同模块的名字限定在各自模块的命名空间中,尽可能地避免名字的冲突。命名空间在C++98标准中已经引入,现在介绍的是现代C++标准新增的功能:内联命名空间(C++11)和嵌套命名空间(C++17),以及在C++20中的改进。
内联命名空间
C++11标准引入了内联命名空间的概念,语法为在namespace前面加上inline关键字,如:
inline namespace MyCode {
// source code
}
内联命名空间中的名字可以被上层命名空间直接使用,无需在内联空间的名字前添加该命名空间的名字为前缀,通过上层命名空间的名字就可以直接访问。内联命名空间的作用之一是升级接口以提供不同的功能,而新接口不与老接口兼容,我们希望新写的代码将调用我们提供的新接口,但不希望影响老的代码。这时可以使用内联命名空间的办法来解决。内联命名空间在第一次定义时必须加上inline关键字,之后再重新打开命名空间时可以加上inline关键字,也可以不加上。
嵌套命名空间
嵌套命名空间在C++98中已有,但它的写法比较冗余。C++17标准中引入了更简洁的嵌套命名空间的定义方式。如:
namespace A::B::C {
void foo() {}
}
这样代码显得简洁得多,更符合使用习惯。在C++20中,我们可以通过以下的方式来定义命名空间:
namespace A::B::inline C {
void foo() {}
}
// 调用foo函数:
A::B::foo();
需要注意的是,inline关键字可以出现在除第一个namespace之外的任意namespace之前。上面的代码需要使用支持C++20标准的编译器来编译,在编译时加上参数-std=c++20。
此篇文章同步发布于我的微信公众号: 内联和嵌套命名空间
如果您感兴趣这方面的内容,请在微信上搜索公众号iShare爱分享或者微信号iTechShare并关注,或者扫描以下二维码关注,以便在内容更新时直接向您推送。