1. 命名空间
1.1 namespace 的价值
在 C/C++ 中,变量、函数名以及类大量存在,这些名称都存在于全局作用域中,可能会导致冲突。使用命名空间的目的是为了解决命名冲突的问题。
#include <stdio.h>
#include <stdlib.h>
int rand = 20;
int main() {
// 重定义,rand 是一个函数,包含在 stdlib.h 里
printf("%d\n", rand);
return 0;
}
本意是打印整型变量,但在 C++ 里,编译器会在局部域先进行查找,找不到再去全局域查找。此时全局域有两个 rand,一个是 rand 函数,一个是 rand 整型变量,这时就会发生报错。
1.2 namespace 的定义
定义命名空间,需要使用 namespace 关键字,后面跟命名空间的名字,然后接一对 {} 即可。{} 中即为命名空间的成员。命名空间中可以定义变量、函数、类型等。
// 解决了命名冲突的问题
namespace LC {
int rand = 20;
struct Node {
int val;
struct Node* next;
};
}
int main() {
// 这里默认访问的是全局域里的 rand 函数指针
printf("%p\n", rand);
// 指定了 rand 的出处,就会直接在 LC 命名空间里去查找
printf("%d\n", LC::rand);
return 0;
}
namespace 本质上是定义出了一个域,这个域跟全局域各自独立,不同的域可以定义同名变量。 C++ 中有局部域、全局域、命名空间域、类域;域影响的是编译器语法查找变量/函数/类型出处的逻辑,所以有了域隔离,名字冲突的问题就解决了。局部域和全局域除了会影响编译器的查找逻辑,还会影响变量的生命周期,命名空间域和类域不会影响变量的生命周期。 namespace 只能定义在全局,也可以嵌套定义。



