命名空间概念引入
当c++工程较大时,程序内会出现大量重名的变量,函数,类和对象。在同一作用域内,重名会导致命名冲突,所以c++引入了命名空间(namespace)的概念。命名空间实际上定义了一个新的作用域,这样在不同命名空间内,就不会再产生命名冲突,
一,命名空间定义
- 一般的命名空间定义
namespace byte { int rand = 10; int Add(int left, int right) { return left + right; } struct Node { struct Node* next; int val; }; }
- 嵌套定义命名空间
namespace N1 { int a; int b; int Add(int left, int right) { return left + right; } namespace N2 { int c; int d; int Sub(int left, int right) { return left - right; } } }
命名空间中可以定义变量,函数,类型,甚至命名空间。
- 同名空间
namespace N1 { int a; int b; int Add(int left, int right) { return left + right; } } namespace N1 { int c; int d; int Sub(int left, int right) { return left - right; } }
同一工程中允许存在同名的命名空间,编译器最终会合成同一命名空间,但命名空间内嵌套的子命名空间不允许重名。
一个命名空间就是定义了一个新的作用域,命名空间内定义的内容只存在于该命名空间内,命名空间之外不能直接进行调用。
二,命名空间的使用
命名空间的使用方式:
- 加命名空间的名称及作用域限定符
namespace byte { int a = 1; int b = 2; int Add(int left, int right) { return left + right; } } int main() { printf("%d\n", byte::a); printf("%d\n", a); //这么写会报错 return 0; }
- 使用using将命名空间中某个成员引入
namespace byte { int a = 1; int b = 2; int Add(int left, int right) { return left + right; } } using byte::b; int main() { printf("%d\n", byte::a); return 0; }
- 使用using namespace加命名空间名称 引入
namespace byte { int a = 1; int b = 2; int Add(int left, int right) { return left + right; } } using namespce N; int main() { printf("%d\n", N::a); Add(10, 20); return 0; }
最后一种命名空间使用,不建议在工程内使用,using namespace加命名空间名称 这相当于展开整个命名空间,后果就是同名冲突。