概述
在C语言中程序的全局变量作用域只有一个,所有的全局标识符都共享同一个作用域,在多人开发的时候,容易造成标识符冲突。C++为了解决这个问题提出了命名空间这一概念,通过命名空间把全局变量作用域划分为不同的部分,不同的命名空间中的可以相同但不产生冲突。
Tips: 标识符:标识符是指常量、 变量、语句标号,用户自定义函数的名称,用户类型等等
命名空间定义
namespace name
{
//自定义的标识符
}
Tips: 1.在全局作用域也叫默认命名空间,在全局作用域定义的自定义标识符都属于默认命名空间
2.命名空间可以嵌套定义
例
namespace First { int i = 0; } namespace Second { int i = 1; int j = 2; namespace Internal { struct Stu { char name[30]; unsigned int number; }; } }
命名空间的使用
定义了命名空间后,接下来就要使用命名空间了。由于“全局作用域”通过命名空间被划分为了多个小的全局作用域。因此,使用命名空间中的成员需要先确定成员属于哪一个命名空间。
直接使用:
命名空间名::[命名空间名::……]成员名;
引入:
1.引入命名空间中所用的成员:using namespace 命名空间名[::命名空间名…];
2.引入命名空间中的单一成员:using 命名空间名::[命名空间名::……]成员名;
引入用命名空间的成员之后,就可以直接使用命名空间中的成员的。这就遇到一个问题,当引入成员名称与局部成员 名称同名时,会是谁覆盖谁,还是报错?编译器两者方式都会采取。
1.当引入命名空间中所用的成员时,局部成员覆盖命名空间中的成员。
2.当引入命名空间中的单一成员时,编译器报错。
例:
#include <stdio.h> namespace First { int i = 0; } namespace Second { int i = 1; int j = 2; namespace Internal { struct Stu { char name[30]; unsigned int number; }; } } int main(void) { using namespace First; //引入所有成员 using Second::Internal::Stu; //引入单一成员 printf("i = %d\n", i); //引入后直接使用 printf("i = %d\n", Second::i); //直接使用 Stu stu1 = {"Jude", 1}; //引入后直接使用 printf("stu1.name = %s\n", stu1.name); printf("stu1.number = %d\n", stu1.number); /**************命名空间的成员与局部变量成员的冲突测试*****************/ int i; //没问题 using Second::j; int j; //报错 return 0; }
命名空间的别名
引用是一个变量的别名。命名空间也是可以用别名。
定义别名:
namespace 别名 = 命名空间名