C++ primer 第5版 p785
命名空间
意义:在开发大型项目的时候,一般使用很多库,每个库都可能定义了大量的类、方法、模板、变量等。库与库之间难免会有重复(有可能不是一个人写的),我们可以将库或者其中特定的部分 names 放到全局的namespace中。
命名空间的定义
- 定义一个命名空间 SpaceA ,(只能定义在全局域,不能定义在函数体内、类中)
namespace SpaceA
{
int a=10;
}
- 命名空间定义可以嵌套
namespace SpaceA
{
int a=10;
namespace SpaceB
{
char name[64];
}
}
- 同一命名空间的定义可以在不同地方(包括不同文件),开发大型项目,同一类型放在一个文件中。
namespace SpaceA
{
int a=100;
namespace SpaceB
{
char name[64];
}
}
namespace SpaceA
{
char c=65;
}
- 对于大型项目,利用namespace组织方式
sale_data.h
#include <string>
namespace julian
{
class sale_data {/*...*/};
sale_data operator+(const sale_data&, const sale_data&);
}
sale_data.c
#include "sale_data.h"
namespace julian
{
//对于sale_data和+重载的实现
}
user.c
#include "sale_data.h"
int main()
{
using namespace julian::sale_data;
sale_data data1, data2;
// ....
return 0;
}
好处:1. 我们可以对用户隐藏具体实现;2. 模块化组织结构,便于多人共同开发同一项目;3. 编译的量减少(不需要编译未使用的names)
- Inline Namespace (c++11) :代码版本维护升级使用
参考:inline namespace
- unnamed namespace :
定义在其中的变量具有static life特性,周期一直到程序结束;只对当前文件有效,可以用来代替c中static(在c++中不建议使用)
namespace
{
int i;
}
命名空间的使用
- 每次使用带前缀
cout << SpaceA::a << endl;
- 在使用处前面进行申明
using namespace SpaceA::SpaceB;
cin >> name;
cout << name;