打印
[开发资料]

单片机C语言编程的全局变量的使用

[复制链接]
1973|46
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
内政奇才|  楼主 | 2023-8-11 10:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
工作也有些年头了,从一位技术新人成长到现在自诩小牛级别的人物,少不了要自己寻找资料阅读。论坛上、书店里、杂志上......要嘛是些菜鸟浅薄的自炫处女贴,要嘛是高屋建瓴云里来雾里去的概念文,好不容易遇到个实践型高手写的文章,却在渐入佳境之际嘎然而止。本是隔靴搔痒,看完后心中更是郁结不已。也罢,今日强装回大牛,献丑谈一谈单片机编程中全局变量问题吧。
单片机程序最易范的错误是全局变量到处飞,这个现象在早期写汇编转型过来的程序员以及初学者中常见,这帮家伙几乎把全局变量当作函数形参来用,多数的.h文档里面一堆的结构体定义和extern,这个模块里边赋值123,那个模块里边判断123分支决定做什么。每当看到这种程序,我总要戚眉变脸而后拍桌喝骂。我不否认全局变量的重要性,但我认为要谨慎地使用它,滥用全局变量会引申带来其它更为严重的结构性问题。诸位看官,且听我细细道来。
1 它会造成不必要的常量频繁使用,特别当这个常量没有用宏定义“正名”时,代码阅读起来将万分吃力。
2.它会导致软件分层的不合理,全局变量相当于一条快捷通道,它使得程序员模糊了“设备层”和“应用层”之间的边界。写出来的底层程序容易多情地关注起上层的应用。这在软件系统的初期或许功能调试进度一日千里,但到了后期往往bug一堆,处处“补丁”,雷区遍布。说是度日如年举步维艰,也不夸张的。
3.由于软件的分层不合理,到了后期维护,哪怕仅是增加修改删除小功能,往往要从上到下掘地三尺地修改,涉及大多数模块,而原有的代码注释却忘了更新修改,这个时候,交给后来维护者的系统会越来越像一个“泥潭”,注释的唯一作用就是为了使泥潭上方充满迷烟瘴气。
4.不必多言,你已经成功得到一个畸形的系统,它处于一个神秘的稳定状态!

然后我告诉大家现实意义的后果是什么。
1.“老人”气昂昂,因为系统离不开他,所有“雷区”只有他了然于心。当出现紧急的bug时,只有他能够搞定。你不但不能辞退他,还要给他加薪。
2.新人见光死,但凡招聘来维护这个系统的,除了改出更多的bug外,基本上一个月内就走人,到了外面还宣扬这个公司的软件质量有够差够烂。
3.虽然产品的升级,几个月没有接触这个系统的原创者会发现,很多雷区他本人也忘记了,每次的产品升级周期越来越长,因为修改一个功能会冒出很多bug,而按下一个bug,会弹出其他更多的bug,在这期间,会产生更多的全局变量。有一天他告诉老板,不行啦不行啦,资源不够了,ram或者flash空间太小了,升级升级。
4.客户投诉不断,售后快崩溃了,业务员也尽量不推荐此产品了,市场份额越来越小,公司形象越来越糟糕。

要问我的对策吗,只有两个原则:
1.能不用全局变量尽量不用,我想除了系统参数、通信处理和一些需要效率的处理模块,其他的基本可以靠合理的软件分层和编程技巧来解决。
2.如果用了,能藏多深就藏多深。如果只有该.c文件用,就static到该文件中,顺便把结构体定义也收进来;如果只有一个函数用,那就static到函数里面去;如果非要开放出去让人读取,那就用函数return出去,这样就是只读属性了;如果非要遭人蹂躏赋值,好吧,我还可以严格控制我的.h档被谁包含,而不是放到公共的includes.h中被人围观,丢人现眼。
如此,你可明白我对全局变量的感悟有多深刻。悲催的我,已经把当年那些老人交给我维护的那些案子加班重新翻写了。你能明白吗,请不要让人背后唾弃你。

使用特权

评论回复
沙发
星辰大海不退缩| | 2023-8-27 20:56 | 只看该作者
能不用全局变量尽量不用,我想除了系统参数、通信处理和一些需要效率的处理模块,其他的基本可以靠合理的软件分层和编程技巧来解决,这个是很重要的技巧

使用特权

评论回复
板凳
AdaMaYun| | 2023-8-27 21:16 | 只看该作者
一般情况下全局变量是系统参数使用

使用特权

评论回复
地板
OKAKAKO| | 2023-8-27 22:33 | 只看该作者
全局变量一般会单独在一个位置使用,方便查找

使用特权

评论回复
5
zhuww| | 2023-8-31 20:43 | 只看该作者
靠合理的软件分层和编程技巧来解决

使用特权

评论回复
6
lzmm| | 2023-9-5 10:07 | 只看该作者
如果全局变量被多个函数同时修改,可能会导致程序的不稳定和不可预测性。

使用特权

评论回复
7
uptown| | 2023-9-5 10:36 | 只看该作者
如果全局变量的定义和使用不当,可能会导致程序出现不可预期的错误,比如变量被多次赋值、数据竞争等问题。

使用特权

评论回复
8
primojones| | 2023-9-5 10:55 | 只看该作者
如果需要使用多个函数来执行一个任务,全局变量可以方便地在各个函数之间共享数据。

使用特权

评论回复
9
lzbf| | 2023-9-5 11:09 | 只看该作者
全局变量可以在程序的任何位置被声明和使用,而不必每次都声明和初始化。

使用特权

评论回复
10
claretttt| | 2023-9-5 11:37 | 只看该作者
全局变量在整个程序中都存在,会占用更多的内存空间。

使用特权

评论回复
11
sanfuzi| | 2023-9-5 12:00 | 只看该作者
在修改全局变量时,应该使用关键字volatile,以告诉编译器不要对全局变量进行优化,以保证程序的正确性。

使用特权

评论回复
12
jackcat| | 2023-9-5 12:34 | 只看该作者
C语言开发单片机为什么大多数都采用全局变量的形式

使用特权

评论回复
13
pmp| | 2023-9-5 12:43 | 只看该作者
在程序中不要频繁地读取或修改全局变量,以减少对内存的占用

使用特权

评论回复
14
claretttt| | 2023-9-5 12:51 | 只看该作者
全局变量可以在程序的任何位置使用,不需要像局部变量那样在函数中重新定义。

使用特权

评论回复
15
sanfuzi| | 2023-9-5 13:10 | 只看该作者
全局变量应该仅用于存储程序中的共享数据,而不应该用于存储局部变量或中间结果。滥用全局变量会使代码变得难以维护和理解

使用特权

评论回复
16
rosemoore| | 2023-9-5 13:21 | 只看该作者
使用全局变量可以减少函数的调用次数,提高程序的执行效率。

使用特权

评论回复
17
lzbf| | 2023-9-5 13:32 | 只看该作者
在程序的主函数或其他函数中初始化全局变量,确保其初始值是正确的。

使用特权

评论回复
18
pmp| | 2023-9-5 13:47 | 只看该作者
避免在程序中定义过多的全局变量,以免占用过多内存和降低程序性能。

使用特权

评论回复
19
macpherson| | 2023-9-5 14:41 | 只看该作者
应该只定义必要的数据。               

使用特权

评论回复
20
hearstnorman323| | 2023-9-5 15:12 | 只看该作者
全局变量的使用可能会降低程序的性能,因为它们需要被加载到内存中,而不是像局部变量那样在函数调用时被创建和销毁。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

153

主题

897

帖子

0

粉丝