OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9866|回复: 8

全局变量通过函数形参进行传递有什么好处?

[复制链接]

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2017-3-18 16:18:30 | 显示全部楼层 |阅读模式
10金钱
看了公司前任工程师写的代码工程(现在那个工程师已经离职).有一点让我感觉很奇怪...
明明是全局变量,假设此时有个Func()函数,明明就可以函数内就可以直接使用这个全局变量,他非要使用个Func(int XXX)通过形参的方式将这个全局变量传递到函数体内,
小弟不才,实在想不出这样写有什么好处...
仅仅是为了降低函数之间的耦合度,还是说有其它优点,恳请指教...

最佳答案

查看完整内容[请看2#楼]

我百度上看过有一个汽车品牌的刹车失灵bug,就是代码中有大量的全局变量存在导致的。 另外,通过形参的方式来写,每个工程师可以写自己独立的驱动,而不是耦合性很高的代码。 LZ可以参考我写的代码,我写的代码很方便移植。 http://blog.csdn.net/feilusia/article/category/6463745
电子爱好者
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2017-3-18 16:18:31 | 显示全部楼层
我百度上看过有一个汽车品牌的刹车失灵bug,就是代码中有大量的全局变量存在导致的。
另外,通过形参的方式来写,每个工程师可以写自己独立的驱动,而不是耦合性很高的代码。

LZ可以参考我写的代码,我写的代码很方便移植。
http://blog.csdn.net/feilusia/article/category/6463745
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

14

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2016-7-27
在线时间
73 小时
发表于 2017-3-18 16:51:14 | 显示全部楼层
本帖最后由 诸葛亮的哥哥 于 2017-3-18 16:54 编辑

如果直接使用是不是如果在函数周期内发生了中断之类的改变了这个全局变量的值,比如if(a!=0)满足以后a被改变成0,此时a被当做了除数的话、、、其实平常自己去使用也不会在乎这个,这也是一种猜想,如果是传参而不是传址的话就只是一个复制
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2017-3-18 17:02:09 | 显示全部楼层
诸葛亮的哥哥 发表于 2017-3-18 16:51
如果直接使用是不是如果在函数周期内发生了中断之类的改变了这个全局变量的值,比如if(a!=0)满足以后a被改 ...

有道理
电子爱好者
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2017-3-18 18:31:23 | 显示全部楼层
通过传参来使用当然有好处啊,你可以想象一下以下情况:一个工程有几十个.c文件,程序变大了以后,连你都不知道在哪个地方把全局变量给改了,通过传参的话,就能把控全局变量的使用,我一般都尽量少用全局变量,如果实在要用,也是通过传参,各.c文件之间就专门写一个Set()函数来修改全局变量,
有些公司的程序不是一个工程师写的,各人负责各人的模块部分代码,各模块代码之间没有关联,所以联系都通过接口函数来操作,没必须开放的底层函数全部对外部屏蔽,其实这个可以参考C++的类,就是这个原理,遵守内敛性、易读性、可维护性、健壮性、易移植性等原则
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2017-3-18 23:41:30 | 显示全部楼层
d1z1y2 发表于 2017-3-18 18:31
通过传参来使用当然有好处啊,你可以想象一下以下情况:一个工程有几十个.c文件,程序变大了以后,连你都不 ...

谢谢大神指教
电子爱好者
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-3-19 12:14:28 | 显示全部楼层
C++玩多了吧.呵呵...
回复

使用道具 举报

22

主题

133

帖子

2

精华

高级会员

Rank: 4

积分
901
金钱
901
注册时间
2015-12-24
在线时间
197 小时
发表于 2017-3-19 22:26:06 | 显示全部楼层
两点:
第一,增强代码可读性,如果工程量太大,而且这个全局变量很多函数都在用的话,等到后期维护,正对这个变量的处理将会无比的蛋疼。
第二,作用域控制,如果像你这个举例,传值而不是地址,那么根据函数作用域的规定,无论函数里怎么折腾,这个全局变量是不会被改变的。
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2017-5-15 13:20:13 | 显示全部楼层
为了避免函数内部意外修改了这个全局变量。
对此还有其他的戴拿风格,如果希望对外部开放只读权限的全局变量,一般都会用函数封装一下。
比如软件定时器中的全局时钟,只会随着时间增加,而对外只希望被读取,不允许被写入。可以在time.c中
[mw_shl_code=c,true]
static unsigned int sg_Tm;

unsigned int Get_Sys_Tm(void)
{
    return sg_Tm;
}[/mw_shl_code]

其他软件模块无法通过sg_Tm变量名访问,只能要调用Get_Sys_Tm函数即可获取该全局时钟,而且无法修改其值,起到只读保护的作用(也增加了一点点开销)
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-21 07:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表