命名空间namespace:指标识符的各种可见范围。
C++标准程序库中的所有标识符都被定义在一个std的namespace,这就是程序开始添加 using namespace std; 的原因。
很多人共同完成一套代码,不可能不出现标识符命名相同的问题,为了解决冲突问题,产生了命名空间namespace。
命名空间包括又名命名空间和无名命名空间
一、有名命名空间
有名命名空间的定义格式:
namespace 空间名 { code } // 有名命名空间的嵌套定义 namespace 空间名1 { code namespace 空间名2 { code } }
有名命名空间的使用格式:
// 直接使用"::"连接空间名和code 空间名:: code; // code为变量或函数
有名命名空间取别名为了方便使用,定义格式如下:
namespace 别名 = 空间名;
using 指令使用格式:
// 表示后面代码都使用此命名空间,如果属空于本空间,无需再使用"::"连接空间名和code using namespace 空间名; // 空间名支持嵌套 //最常用的std空间 using namespace std;
举例:
#include <iostream> // 使用std命名空间下的变量 using namespace std; int a = 5; namespace A { int a = 10; // 命名空间支持嵌套定义 namespace B { int a = 15; int b = 20; } // 命名空间可以重复定义,相当于扩充 namespace B { int x = 30; int y = 35; } } namespace C { int a = 25; // 错误,命名空间不能嵌套声明 // namespace D; } int main(void) { // 如果不写using namespace std,就必须加前缀std:: std::cout << "Hello World!" << std::endl; cout << endl; // 换行 cout << "a = " << a << endl; cout << "A::a = " << A::a << endl; cout << "A::B::a = " << A::B::a << endl; cout << "C::a = " << C::a << endl; // 错误,提示变量b没有声明 // cout << "b = " << b << endl; cout << endl; // 命名空间取别名 namespace AB = A::B; cout << "AB = A::B" << endl; cout << "AB::a = " << AB::a << endl; cout << "AB::b = " << AB::b << endl; cout << endl; // 后面的代码使用A::B命名空间下的变量 using namespace A::B; cout << "使用A::B命名空间" << endl; cout << "b = " << b << endl; cout << "x = " << x << endl; cout << "y = " << y << endl; return 0; }
执行结果:
二、无名命名空间
命名空间不仅可以避免名称冲突,还可以是代码保持局部性,从而保护代码不被他人非法使用。
在当前的编译单元直接使用无名命名空间中的成员,但是在当前编译单元之外,它是不可见的
无名命名空间定义格式:
namespace { code }
举例:
#include <iostream> // 使用std命名空间下的变量 using namespace std; // 如果定义与无名命名空间相同,则会产生冲突报错 //int a = 5; namespace { int a = 10; int b = 20; namespace B { int a = 30; int b = 40; } int add(int a, int b) { return (a + b); } } int main(void) { // 默认使用无名命名空间中的变量和空间 cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "B::a = " << B::a << endl; cout << "B::b = " << B::b << endl; cout << endl; cout << "a + b = " << add(a, b) << endl; cout << "B::a + B::b = " << add(B::a, B::b) << endl; return 0; }
执行结果:
总结:
1、命名空间可以嵌套定义,但不能嵌套声明;
2、可以多次声明和定义同一命名空间,相当于扩充,并添加新成员;
3、无名命名空间中的成员不能与同一文件中外部的成员相同;
4、无名命名空间中的成员使用方式与全局变量使用方式相同。