C++学习之旅之namespace
1.1 、C++为什么要引入namespace(命名空间)
1.2 、C++的命名空间基本语法和使用
1.3、 C++的默认命名空间
1.4、 C++的匿名命名空间
学习内容:
1.1.、 C++为什么要引入namespace
谈到这个问题,我们就得先来说说namespace的在C++中的作用,namespace命名空间,本质上是通过改变程序代码的作用域而达到改变程序的链接属性。通常C程序的作用域有以下几种:
(1) 代码块儿作用域,譬如:函数体
(2) 文件作用域,譬如:静态全局变量、静态函数
(3) 全局作用域,extern 函数 或者全局变量
它们的作用域相对应的链接属性分别是:
(1)无链接
(2)内链接
(3)外连接
C语言中有这样的规则是因为需求而产生的,也就是说这些规则是为了解决一些问题而产生的,那到底是因为什么问题而要有这些规则呢? 是因为程序一旦变的复杂,变的大型化,就需要分工合作,每个人负责一个模块。这样一来很难保证每个人定义全局变量和函数不冲突。所以C语言程序定义函数和全局变量时,都加固定前缀譬如:STM32HAL库中的每个模块代码都是:HAL_XXX_funcname,将不需要外部使用的函数都加上static 限定作用域。那么,我们回到C++,C++是C的超集,加入了namespace根本上是也是为了解决上述的问题C语言中虽然也有static 等关键字,但是并不能完全解决问题,还需要程序员自己注意。而且,C语言中不能限定类型的作用域。
相信通过上面的说明,大家已经知道为什么C++要加入namespace了。
1.2 、C++的命名空间基本语法和使用
1.2.1、namespace定义
namespace NS1
/*keyword namesapce name*/
{
//变量定义
//函数定义
//类型
};
1.2.2、调用namespace中函数或者其他
/**
* 常用的调用namespace中的方法
*/
// 定义并声明
namespace NS1
{
//变量定义
int a = 11;
//函数定义
void func1(void)
{
}
//类型
enum e1
{
e1_mem1,
e1_mem2,
};
};
/* 第二种使用方法 */
using namespace NS1;
int main(int argc, char **argv)
{
/* 第一种使用方法 ::是域中作用符 */
/**
NS1::func1();
NS1::a = 2;
NS1::enum e1 e11; **/
/* 第二种使用方法 */
func1();
a = 2;
e1 e11;
}
void func2(void)
{
}
1.3、 C++的默认命名空间
通过上述代码示例我们有一个疑问? 就是main函数属于哪里?属于哪个namesapce? 那就是默认命名空间
,main函数属于默认命名空间,又叫全局命名空间
。
那么如何调用全局(默认)命名空间呢?如何表示全局(默认)命名空间呢? 下面为你们解惑:
首先要引入一个C++的中符号,就是域作用符号.表现形式是 ::
上述示例中第一种的调用方式:NS1::xxx;NS1是命名空间名称,::是域
作用符,xxx是具体函数/变量/类型。那么到底如何表示全局(默认)
命名空间呢?
:: 表示默认(全局)命名空间
举个例子:
/**
* 调用默认(全局)命名空间的方法
*/
void func2(void); //声明默认(全局)中的函数
// 定义并声明
namespace NS1
{
//变量定义
int a = 11;
//函数定义
void func1(void)
{
::func2();
}
//类型
enum e1
{
e1_mem1,
e1_mem2,
};
};
int main(int argc, char **argv)
{
}
void func2(void)
{
}
1.4、 C++的匿名命名空间
匿名命名空间的定义是没有名字的命名空间,既然没名字那么就不能表示,不能表示,就不能声明,不能声明,就不能外部引用,所以匿名命名空间真正的价值在于此。匿名命名空间中是纯文件内部使用的命名空间不需要在外部引用。类似于static的关键字的作用。
namespace
{
};
总结:
`
学习新东西,要使用自己已知的知识去类比学习,当自己有一个自己的体系,那么学习新的东西就会很顺了。就比如学习C++,在有C语言基础的情况下,学习C++就会很顺很舒服。知识连成网,就能融汇贯通了。
大家如发现,有不严谨,不对的地方,请多多指教,一定要第一时间告诉啊。后续我会继续做这样的博客。记录学习的点滴。分享是一种美德!感谢每一位分享知识的人,我们都在路上!