C++语言之父:Bjarne Stroustrup博士(本贾尼)
当我们在编写代码的时候,可能会产生一些命名冲突,为了解决这一冲突我们引出命名空间的概念
(ps:命名冲突的产生主要包括两个方面原因:1、与库函数名冲突;2、相互之间的冲突<比如在和朋友一起完成一个项目时,在互相不知晓的情况下,写了两个同名函数>)
☑ 命名空间:定义一个新的作用域,对标识符的名称进行本地化, 以避免命名冲突或名字污染
那么这个时候就有人要问了,怎么又有一种新的作用域呀(C语言中就接触到了局部和全局作用域,suoyi作用域都有哪些呀)?
☑ 命名空间的定义:(命名空间中的变量也属于全局变量)
namespace + 名字
{
... ...
}
(注意最后面是没有分号的)
eg:
namespace A
{
int x = 20;
}
用namspace + 名字来定义一个命名空间,命名空间内就是一个命名空间域,此作用域中的内容可通过展开了的命名空间域or指定访问命名空间域的方式来搜索访问。(跳转至下一个要点解释如何访问→)
1、命名空间不仅可以定义变量 还可以定义函数类型等 名字可随意但是注意最后不能给分号(与结构体不同)
namespace + 名字
{
... ...
}
(注意最后面是没有分号的)
eg:
namespace A
{
int x = 20;
}
2、可嵌套 N1(N2) 二者同时定义a变量 访问N2中的a可以用 N1::N2::a来访问
namespace N1
{
int a = 1;
namespace N2
{
int a = 5;
int b = 10;
int c = 20;
}
}
int main()
{
printf("%d\n", N1::a);//访问N1中的a
printf("%d\n", N1::N2::a);//访问N2中的a
return 0;
}
3、一个项目中的相同名字的命名空间可以合并到同一个命名空间中
☑ 访问方式:
①展开了的命名空间域
展开整个命名空间域
using namespace A;
展开部分(eg:展开std命名空间中的cout函数)
using std::cout;
②指定访问命名空间域
namespace A
{
int x = 20;
}
int main()
{
int x = 10;
printf("%d\n", A::x);
return 0;
}
☑命名空间的使用(初步理解)
◎这里使用命名空间,相当于把x封装到了命名空间域中,可以通过特定方式来访问,也就解决了上述问题。
☑命名空间使用的相关注意事项
1、使用展开命名空间域的方式是有风险的,很有可能与全局变量产生冲突,因此一般使用指定访问or展开部分的方式来访问。
2、展开了的命名空间域&&包含头文件的区别
展开了的命名空间域是指 搜索(在编译阶段去命名空间中搜索);
包含头文件是指 展开(在预处理阶段将头文件中的内容展开)