1.命名空间的作用
1.1 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。
使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
2.命名空间的定义
2.1 定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
#include<stdio.h>
//namespace + 命名空间名称
namespace N1 //N1为命名空间的名称
{
//命名空间的内容,既可以定义变量也可以定义函数
int a = 0;
void fun1()
{
printf("N1:fun1()\n");
}
//命名空间可以嵌套
namespace N2
{
int a = 1;
void fun1()
{
printf("N1:N2:fun1()\n");
}
}
}
//同一工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中
//分段定义
namespace N1
{
//int a;同一作用域中不允许重定义
int b = 20;
int c = 30;
void fun2()
{
printf("N1:fun2()\n");
}
}
3.命名空间的使用
3.1 命名空间的三种方式:
//全局变量
namespace N1
{
//int a = 0;
int b = 20;
int c = 30;
void fun2()
{
printf("N1:fun2()\n");
}
}
int a = 10;
void fun1()
{
printf("fun1()\n");
}
void test()
{
//全局:a
printf("a: %d\n", a); //10
//命名空间中成员的访问形式
//1.命名空间 :: 成员
printf("N1::a: %d\n", N1::a); //0
N1::fun2();
//2.using 命名空间 :: 成员
using N1::b; //也可以放在代码块外面
printf("N1::b: %d\n", b); //20
//3.展开命名空间:using namespace 命名空间
//命名空间下的所有成员全部都暴露在全局作用域中,会和全局域中的成员发生混淆
using namespace N1; //也可以放在代码块外面
//printf("N1::a: %d\n", a);会和全局变量a产生冲突
printf("N1::c: %d\n", c);//30 ,全局变量没有c,不会产生冲突
fun2();
}