c++基本编程体验第3节之命名空间
3.1、何为命名空间
3.1.1、命名空间的引入
(1)命名空间namespace,是c++引入的一种解决全局变量和函数名冲突机制
(2)c语言没有namespace,但是c++及之后的java python 等都有
(3)namespace的关键点有2个:一是如何解决名称冲突,二是如何合法的访问变量
3.1.2、c语言如何解决名称冲突
(1)首先在大型的c语言项目中,全局变量和函数命名冲突在所难免。
(2)c语言中的办法是:
1.同一个c文件不要太大,且由同一个人编写。
2.每个c文件中全局变量或者函数前加唯一前缀(比如 HAL库的sd卡模块统一加 HAL_SD_XXX)。
3.不需要外文件访问的全局变量和函数前加static。
3.1.3、命名空间如何解决问题
(1)为实现命名空间机制,c++引入namespace关键字,定义格式为namespace xx{}。
(2)一个特定的名称namespace的一对大括号内部定义的变量、函数、类等均属于该命名空间内。
(3)在该命名内部互相引用是可以直接使用变量名、函数名等。
(4)跨命名空间互相引用时必须同时指定被引用方的命名空间名和变量函数名才可以找到。
(5)命名空间本质上其实是对全局变量和函数在一定范围内链接属性的更改和控制。
3.1.4、关于语言
(1)语言特性必定对应解决某种问题,必定在某方面对程序员有帮助。
(2)语言特性是语言通过关键字或者符号所支持的一种功能特性,如:namespace、template、运算符重载、面向对象。
(3)语言特性越多则语言本身就越难使用,但是语言就越厉害。
(4)掌握一种本质就是掌握和熟练运用语言特性。
3.2、namespace的初级定义和使用
3.2.1、同一文件定义namespace
namespace name
{
};
3.2.2、同一文件内使用namespace
(1)命名空间的名称 :: 函数名 //跨命名空间访问函数(变量亦可)
(2)using 命名空间的名称 :: 函数名; //声明该命名空间的函数(变量亦可)
函数名 //编译是可以找到
(3)using namespace 命名空间名; //声明该命名空间,在使用时可以随意访问该命名空间内的函数和数据
3.2.3、不同文件(比如 1.cpp 2.cpp)内使用namespace
(1)猜测 using ns2::func3; //实际编译会报错
(2)
注意声明和定义的区别;
3.3、c++默认命名空间
3.3.1、默认命名空间
(1)又叫全局命名空间
(2)默认命名空引用其他命名空间方法
(3)默认命名空间引用自己的办法
(4)其他命名空间引用默认命名空间中的办法::f()
3.4、c++匿名命名空间
3.4.1、std和cout的引入
(1)std是c++标准库定义好的一个namespace
(2)cout是std这个namespace下的一个标准工具,类似于c中的printf
(3)用法
3.4.1、匿名命名空间的定义和使用
(1)定义
namespace
{
void func(void)
{
}
}; //func属于匿名命名空间
(2)匿名命名空间中引用其他命名空间中的方法 --
(3)匿名命名空间中引用自己命名空间的方法
(4)其他命名空间中引用匿名命名空间中的方法-----跨文件是不可行的。
3.4.1、匿名命名空间存在的价值和意义
(1)匿名命名空间中的符号纯文件内部使用,不需要被外部引用。
(2)匿名命名空间效果类似于全局变量和函数加static,但是匿名命名空间的作用比c中的使用范围要广,比如:结构体类型也可以不让外部文件访问,但是c语言做不到。
(3)匿名命名空间的用法逻辑上符合整个命名空间的一贯原则。
3.5、嵌套的命名空间
3.5.1、嵌套namespace的定义和使用
(1)定义
(2)外部引用嵌套命名空间内的符号
(3)嵌套命名空间内部不同层次间符号的互相引用。