一、命名空间
01)定义
在 C/C++ 中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace 关键字的出现就是针对这种问题的。
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main() {
// 编译报错:error C2365: 'rand': 重定义;以前的定义是'函数'
printf("%d\n", rand);
return 0;
}
简单来说,namespace 能让我们用相同的函数或变量名字来做不同的事。
定义命名空间,需要使用到 namespace 关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
- namespace 本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以上面的 rand 不在冲突了。
- C++ 中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找一个变量函数/类型出处 (声明或定义) 的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期
- namespace 只能定义在全局,当然他还可以嵌套定义。
- 项目中多文件中定义的同名 namespace 会认为是一个 namespace,不会冲突。
- C++ 标准库都放在一个叫 std(standard) 的命名空间中。
namespace bit {
// 命名空间中可以定义变量/函数/类型
int rand = 10;
int Add(int left, int right) {
return left + right;
}
struct Node {
struct Node* next;
int val;
};
}
02)使用
编译查找一个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。所以下面程序会编译报错。所以我们要使用命名空间中定义的变量/函数,有三种方式:
- 指定命名空间访问,项目中推荐这种方式。

