命名空间 namespace
#include<iostream> int rand = 0; int main() { printf("%d", rand); return 0; }
上述代码一定会出现以下情况:
原因: 自己定义的rand变量为某一库函数里面已经声明过的函数,意思就是你自己定义的东西跟库函数的东西重复了。这种错误就是命名冲突。
命名冲突问题:
- 我们自己定义的变量、函数可能跟库里面重名冲突。
- 进入公司项目组后,做的项目通常比较大,多人协作,可能命名冲突。
C语言没有办法很好的解决这个问题。
C++提出了一个新语法:命名空间
命名空间的定义
对于上面的问题我们使用命名空间来解决:
#include<iostream> namespace zzy { int rand = 0; } int main() { printf("%d", zzy::rand); return 0; }
我们使用namespace来划定一个区域,叫做域,域的名字叫zzy(名字可以自己定义,但是最好不要跟库已有的重复)。这个域就像是隐身衣一样,让系统编译的时候不会去这个区域里面读取。
:: 为域作用限定符,前面是命名空间的名称,后面是命名空间里的变量、类型、函数等。使用这个限定符来指定我们使用的是哪个命名空间里的变量
需要注意的一点是,命名空间是全局的,必须要写在main函数的外边。
下面举些例子来帮大家更清晰的了解命名空间:
1. 函数定义在命名空间里
#include<iostream> namespace zzy { int Add(int x, int y) { return x + y; } } int main() { printf("%d\n", zzy::Add(1, 2)); return 0; }
如果把函数的定义写在命名空间的外面,而函数声明在命名空间里面会怎么样?由于命名空间会屏蔽掉,相当于你没有写这个声明。但是如果你的函数定义写在main函数的上面就没什么问题了。
#include<iostream> namespace zzy { int Add(int x, int y); } int Add(int x,int y) { return x+y; } int main() { printf("%d\n",/*zzy::*/Add(1, 2)); return 0; }
一点要注意,这个时候你不可以写zzy::了,因为如果你这么写的话系统会优先去zzy命名空间里去寻找,发现只有函数的声明,没有函数的定义,所以是没结果的。
2.对全局变量使用命名空间
#include <iostream> int a = 0; int main() { int a = 10; printf("%d",::a);//使用全局作用域的a,::前面的没有东西代表全局作用域 }
3.命名空间的嵌套
#include <iostream> namespace zzy { int a = 10; namespace N1 { int b = 20; } } int main() { printf("%d\n",zzy::a); printf("%d\n",zzy::N1::b); }
4.using命名空间
我们发现,每次使用一些命名空间里的变量总是要加上”命名空间名称::”,当变量多时,就会显得很繁琐。所以我们可以这么做:
#include <iostream> using 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)); }
也可以解放一部分变量、函数等:
#include <iostream> using namespace zzy { int count = 12; void B() { int cur = 0; } } //只解放了一部分变量 using zzy::B::cur; int main() { printf("%d",zzy::count); printf("%d",cur); }
5.命名空间里的结构体
#include <iostream> using namespace zzy { int count = 0; struct Node { int val = 0; }; } int main() { struct zzy::Node node;//注意::的位置,我们要找的是Node node.val = 12; printf("%d\n", node.val); }
到此这篇关于C++ namespace命名空间解析的文章就介绍到这了,更多相关C++ 命名空间内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/zhaozhenyu123/article/details/121502707