1. 命名空间的引入
(1)命名空间namespace,是C++引入的一种解决全局变量(定义在函数之外的变量)和 函数名(都是全局的)冲突的机制,
(2)C语言是没有namespace,但是C++及之后的java python等都有
(3)namespace的关键点有2个:一是如何解决名称冲突,二是如何合法访问变量
2. C语言如何解决名称冲突
(1)大项目中会有很多C文件,全局变量和函数都是extern(可以跨文件访问,访问前还是要声明的)链接属性,因此名称冲突是客观存在(在一个大的工程里面,全局变量和函数名在多个文件之间是可以互相访问的,这个客观需求导致了它们的名称有可能冲突)
(2)一个项目是一个单体程序,项目中的全局变量和函数理应能互相访问,因此名称冲突是客观存在的,
(3)C语言解决名称冲突的办法是:第一,同一个C文件不要太大,由一个人写;第二,每个C文件(或几个C文件构成的一个模块)中所有全局变量和函数前加统一的唯一前缀(例如,如果是串口模块统一加uart,另外一个人写的SPI的,前面就加一个SPI);第三,不需要文件外访问的全局变量和函数前面都加static(局部的,即使重名也没关系)。
(4)C语言的解决方案可行,C++早期就是这样做的,但这种方法太low(这种方法语言本身并没有解决问题,是通过程序员的自觉性来控制的,如果这个程序员自觉性差,那么就有可能造成冲突),C语言写的大项目本来就不多,这种方法也就勉强能够应付,到了C++这种都是面对大型项目,感觉就不是太够用了,所以就引用了命名空间这种机制,从语言本身上去解决这个问题。
3. 命名空间如何解决问题
(1)为实现命名空间机制,C++引入了namespace关键字,定义格式为namespace xx{}(xx是命名空间的名称,大括号是作用域范围,意思是作用域范围内属于xx);
(2)一个特定名称的namespace的一对大括号内部定义的变量、函数、类等均属于该命名空间内
(3)在命名空间内部互相引用时可以直接使用变量名、函数名等。
(4)跨命名空间互相引用时必须同时指定被引用方的命名空间名和变量名函数名才可以找到
(5)命名空间看起来就好像一种前缀(真正的变量是xx加上{}里面的变量名构成)
(6)命名空间本质上其实是对全局变量和函数在一定范围内链接属性的更改和控制(意思是你在{}内部定义了一个全局变量,你超出了xx这个空间就变成了局部变量了)
4. 关于语言特性的思考
(1)语言特性是语言通过关键字或符号所支持的一种功能特性,如namespace、template、运算符重载、面向对象等。
(2)语言特性必定对应解决某种问题,必定在某方面对程序员有帮助
(3)语言特性越多或者设计越复杂,则语言本身就越难使用,但语言就越厉害(效率高)
(4)语言特性体现为某种语法,本质上靠编译工具链提供支持
(5)C++11/14/17/20的版本变迁,无非是新增或修正某些新语言特性
(6)就事论事讨论编程语言,其实难点都在掌握和熟练运用语言特性上