目录
一、命名空间namespace
由于C++大量存在的标识符(变量、函数和类的名称),并且这些标识符处于全局作用域中,为避免命名冲突或命名污染,
namespace
对这些标识符的名称进行了本地化,使编译器在全局作用域中不直接检索到这些标识符。
1、作用域限定符"::"
#include <stdio.h> int a = 2;//全局变量 int main() { int a = 1;//局部变量 printf("a = %d\n", a); return 0; }
在c语言中关于域知识点,在程序中默认查找规则是先局部后全局,以上程序中输出
a = 1,但是我想要输出a匹配最外面的a,怎么做呢?#include <stdio.h> int a = 2;//全局变量 int main() { int a = 1;//局部变量 printf("a = %d\n", ::a); return 0; }
这样输出就变成a = 2,因为" ::a"匹配的是int a = 2;"::"是域限定符,"::"前面是限定范围,前面没有限定范围为默认全局,让查找规则变为只在全局中查找。即全局变量int a = 2;
可是全局中没有,不会在找局部的。限定域就只能在这个域中,不会超出,以下图为例。
域限定符"::"只在C++中有,C语言中是没有的;
2、命名空间的定义
关键字:namespace
使用方法:"namespace" + "名字" + "{ }"使用命名空间的内容:"命名空间名字" + ":: " + "内容名字"
例:
#include <stdio.h> namespace my { //命名空间中可以放变量、函数、类型 int a = 1, b = 2; struct strab { int s1; int s2; }; int add(int a, int b) { return (a + b); } } int main() { my::a = 3; printf("%d\n", my::a); //这里会打印命名空间my中a的值 struct my::strab node; //注意类型中命名空间名字放的位置 node.s1 = 1; node.s2 = 2; printf("%d\n", my::add(my::a, my::b));//函数也要指定域名 return 0; }