- 命名空间 namespace
- 命名空间的定义
#includeint rand = 0; int main() { printf("%d", rand); return 0; }
上述代码一定会出现以下情况:
原因: 自己定义的rand变量为某一库函数里面已经声明过的函数,意思就是你自己定义的东西跟库函数的东西重复了。这种错误就是命名冲突。
命名冲突问题:
- 我们自己定义的变量、函数可能跟库里面重名冲突。
- 进入公司项目组后,做的项目通常比较大,多人协作,可能命名冲突。
C语言没有办法很好的解决这个问题。
C++提出了一个新语法:命名空间
对于上面的问题我们使用命名空间来解决:
#includenamespace zzy { int rand = 0; } int main() { printf("%d", zzy::rand); return 0; }
我们使用namespace来划定一个区域,叫做域,域的名字叫zzy(名字可以自己定义,但是最好不要跟库已有的重复)。这个域就像是隐身衣一样,让系统编译的时候不会去这个区域里面读取。
:: 为域作用限定符,前面是命名空间的名称,后面是命名空间里的变量、类型、函数等。使用这个限定符来指定我们使用的是哪个命名空间里的变量
需要注意的一点是,命名空间是全局的,必须要写在main函数的外边。
下面举些例子来帮大家更清晰的了解命名空间:
1. 函数定义在命名空间里
#includenamespace zzy { int Add(int x, int y) { return x + y; } } int main() { printf("%dn", zzy::Add(1, 2)); return 0; }
如果把函数的定义写在命名空间的外面,而函数声明在命名空间里面会怎么样?由于命名空间会屏蔽掉,相当于你没有写这个声明。但是如果你的函数定义写在main函数的上面就没什么问题了。
#includenamespace zzy { int Add(int x, int y); } int Add(int x,int y) { return x+y; } int main() { printf("%dn",Add(1, 2)); return 0; }
一点要注意,这个时候你不可以写zzy::了,因为如果你这么写的话系统会优先去zzy命名空间里去寻找,发现只有函数的声明,没有函数的定义,所以是没结果的。
2.对全局变量使用命名空间
#includeint a = 0; int main() { int a = 10; printf("%d",::a);//使用全局作用域的a,::前面的没有东西代表全局作用域 }
3.命名空间的嵌套
#includenamespace zzy { int a = 10; namespace N1 { int b = 20; } } int main() { printf("%dn",zzy::a); printf("%dn",zzy::N1::b); }
4.using命名空间
我们发现,每次使用一些命名空间里的变量总是要加上”命名空间名称::”,当变量多时,就会显得很繁琐。所以我们可以这么做:
#includeusing namespace zzy { int count = 12; int Add(int x,int y) { return x+y; } } //解放了整个zzy空间,使里面的变量等变得不隐身了 using namespace zzy; int main() { printf("%d",count); printf("%d",Add(1,2)); }
也可以解放一部分变量、函数等:
#includeusing namespace zzy { int count = 12; void B() { int cur = 0; } } //只解放了一部分变量 using zzy::B::cur; int main() { printf("%d",zzy::count); printf("%d",cur); }
5.命名空间里的结构体
#includeusing namespace zzy { int count = 0; struct Node { int val = 0; }; } int main() { struct zzy::Node node;//注意::的位置,我们要找的是Node node.val = 12; printf("%dn", node.val); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)