目录
- 命名空间 namespace
- 命名空间的定义
命名空间 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);
}