命名空间原创
# 3.1 命名空间的using声明
命名空间是一种防止命名冲突的策略,在不同命名空间下可以使用相同的名字。在构建大型项目时,往往会使用多个独立开发的库,这些库又会定义大量全局名字,如类、函数、模板等。C++使用命名空间(namespace)来避免命名空间污染(namespace pollution)。
# 命名空间定义
namespace shop {
char* name;
int stars;
}// 无须分号
1
2
3
4
2
3
4
# 命名空间可以是不连续的
在上面定义的shop命名空间中添加一些新成员声明。
namespace shop {
class Book{/*...*/};
class Food{/*...*/};
}
1
2
3
4
2
3
4
命名空间定义可以不连续的特性使得我们可以按以下方式组织命名空间。
- 头文件命名空间:类的定义,以及声明作为类接口的函数和对象
- 源文件命名空间:类的实现
这种接口和实现分离的机制确保我们所需的函数和其他名字只定义一次,而只要用到这些实体的地方都能看到对实体名字的声明。
定义多个类型不相关的命名空间应该使用单独的文件分别表示每个类型(或关联类型构成的集合)。
如果一个函数的声明在命名空间中,函数定义时用到命名空间中的名字可以简写。
# 全局命名空间
::member_name
1
表示全局命名空间的一个成员。
# 嵌套命名空间
namespace A {
namespace A1 {
int a;
}
namespace A2 {
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
// 访问变量a
A::A1::a = 1;
1
2
2
# 内联命名空间
内联命名空间的名字可以被外层命名空间直接使用。
inline namesapce version5{
int versionNum;
}
1
2
3
2
3
关键字inline
出现在命名空间第一次定义的地方,后续定义可不写。
使用场景:代码发布版本发生改变时,常常将新版设置为内联,旧版不设置内联。
namesapce version4{
int versionNum;
}
1
2
3
2
3
version将同时使用这两个命名空间。将每个命名空间定义在同名头文件中,则version定义如下所示:
namespace version{
#include "version4.h"
#include "version5.h"
}
1
2
3
4
2
3
4
因为version5是内联的,所以形如version::versionNum
的代码可以直接获取version5的成员,使用version4则需要加上完整的外层命名空间version::version4::versionNum
。
# 命名空间的使用
# 命名空间别名
namespace s = shop;
namespace a1 = A::A1;
1
2
2
# using声明和using指示
using声明(using declaration)一次只引入一个命名空间成员,作用域与变量作用域类似。
using namespace shop::Book;
1
using指示(using directive)使得某个命名空间中所有名字都可见
using namespace shop;
1
# 直接使用
A::A1::a = 1;
1
编辑 (opens new window)
上次更新: 2022/10/03, 09:24:26
- 01
- Linux系统移植(五)--- 制作、烧录镜像并启动Linux02-05
- 03
- Linux系统移植(三)--- Linux kernel移植02-05