作为嵌入式开发工程师,C语言应该是大家学习的第一门编程语言,也是用到最多的一门语言,但是你对C语言
真的很了解了吗,今天和大家一起讨论一下C语言中的变量应该怎样使用。
C语言变量主要分为全局变量和局部变量,全局变量申请以后可以被程序里所有源文件的函数访问使用。局部变量为函数独有,只在创建此局部变量的函数内部可以访问使用。由于局部变量作用范围小,函数返回时即释放,只用于实现函数功能,所以一般不会出太大BUG,即使出现BUG直接定位到函数进行调试分析即可解决问题。但是全局变量可能在多个源文件里的多个函数中被使用,这就导致一旦全局变量出现问题就要对很多函数做修改,给程序的维护带来很多麻烦。针对于全局变量我们来细说一下它的优缺点:
优点1、全局可见,任何一个函数或线程都可以读写全局变量,同步操作简单,便于程序开发者前期开发调试,适合个人独立开发的小规模项目。
优点2、内存地址固定,不需要像局部变量那样从栈中申请释放,读写效率比较高。这就涉及C语言的编译原理了,可以结合C到汇编来深入理解这句话。
缺点1、全局变量存放在静态存储区,系统需要为其分配内存,一直到程序结束,才会释放内存,这一点就局部变量的动态分配,随用随从栈中申请,用完(函数调用完毕)就释放。这一问题导致内存空间资源浪费,可以通过堆动态申请释放变量来优化此问题。
缺点2、影响函数的封装性能,我们肯定是希望我们写的函数具有重入性,就如一个黑盒子一般,只通过函数参数就能得到返回,内部实现要独立,但是如果函数中使用了全局变量,这势必就破坏了函数的封装性,会造成对全局变量的依赖。
缺点4、降低代码的可读性,这也意味着系统维护会不方便,因为一个全局变量可能会出现程序中的各个环节,函数的执行也会根据环境变化而变化,所以调试会不太方便。
缺点5、全局变量的读写,可能会延迟,这主要是体现在“写”操作上,由于写操作,一般需要2个周期操作,所以有可能会出现,这边没写完时,那边已经读了,结果读到的不是最终值,这个是一个概率事件,概率很小,但是并不代表没有。此问题多发生在多线程框架程序以及中断里使用全局变量。所以突发性的代码里尽量避免使用全局变量,即使使用也需要考虑全局变量的重入互斥问题。
上面的说的缺点,可能有些人会觉得有些矫情,或者概率很小,这个要分情况讨论的,如果对于一个非常简单的程序来说,代码量少,功能也少,那全局变量无疑是最适合的同步方式。但是对于代码量大,功能有多,逻辑又复杂的系统来讲,“稳定”来源于方方面面,其中就需要严谨和方便维护,所以不适用全局变量能够大大的避免出bug,方便后期维护,这个时候就需要考虑下,尽量少用全局变量,替代全局变量的方式有很多,最简单易用的就是信号量或者消息队列。这个在裸机程序里也很好实现,而在操作系统中,就更方便了,因为一般操作系统 都会提供信号量功能,可以直接使用。
如果开发的程序项目不特别强调执行效率可以将必须要申请的全局变量通过函数封装起来,以形参传递到函数内对全局变量进行写操作,以函数返回值的形式读取全局变量,以此来供其他源文件访问该全局变量的函数接口,尽量减小全局变量的直接出现作用范围。