搜索
bottom↓
123
返回列表 发新帖
楼主: typedef

如何尽量地避免使用全局变量呢?

  [复制链接]

出0入0汤圆

 楼主| 发表于 2014-12-1 11:22:18 | 显示全部楼层
小柯师傅 发表于 2014-11-30 11:59
楼主的问题可改为,如何转变 编程的思路,由"面向过程"的方法转向"面向对象"的方法?
大量使用全局变量意味 ...

确实是这样,关键还是思想的转变

出0入0汤圆

发表于 2014-12-9 14:14:49 | 显示全部楼层

你好Gorgon_Meducer :对于        SAFE_ATOM_CODE(                           //! 原子操作的保护宏
        wResult = s_wCounter;
    )       
这部分我不明白SAFE_ATOM_CODE是怎么怎么进行的原子操作的保护宏,可以讲解下吗?或者给出SAFE_ATOM_CODE的宏定义我自己试着分析下。

出0入296汤圆

发表于 2014-12-9 14:18:30 | 显示全部楼层
LVmcu 发表于 2014-12-9 14:14
你好Gorgon_Meducer :对于        SAFE_ATOM_CODE(                           //! 原子操作的保护宏
   ...

参考这个帖子

http://www.amobbs.com/thread-5539888-1-1.html

出0入0汤圆

发表于 2014-12-9 15:37:14 | 显示全部楼层
bbglx 发表于 2014-9-28 18:58
楼主看看 qp状态机里的仿对象化编程或许能得到些启发。

使用QP后,的确,程序的耦合度明显下降。但是我的程序还是存在几个全局变量,
我在想是否可把全局变量A放在的AO_A中,其他AO需要访问全局变量A时,直接发
消息到AO_A中进行访问,然后AO_A以QF_PUBLISH(...,...)发布消息?

请问有没有更好的办法?

出0入0汤圆

发表于 2014-12-9 17:02:37 | 显示全部楼层
cjr82123 发表于 2014-12-9 15:37
使用QP后,的确,程序的耦合度明显下降。但是我的程序还是存在几个全局变量,
我在想是否可把全局变量A放 ...

可以吧。
一般可以把要共享数据的函数整合到一个对象里去,不能整合的就用对象之间的通讯
你可以在变量改变后通知其他对象或者等其他对象来查询

出0入0汤圆

发表于 2014-12-10 09:46:30 | 显示全部楼层
这个帖子不错呀,get 和 set 方式很好,有点类似于java bean。对于代码维护很方便!

出0入0汤圆

发表于 2014-12-11 15:37:02 来自手机 | 显示全部楼层
foxpro2005 发表于 2014-9-29 14:03
比如像用于配置的“参数”类的变量, 一般情况下这类模块中的变量会比较多。
这种情况,如果单独封装每个变 ...

能举个详细点的例子吗

出0入0汤圆

发表于 2014-12-11 15:51:04 来自手机 | 显示全部楼层
typedef 发表于 2014-11-3 08:28
我现在是,写之前先想好程序架构,分好层次,构思好每个模块的数据结构,在单文件内使用static变量或结 ...

能给个简单例子吗

出0入0汤圆

发表于 2014-12-17 22:03:51 | 显示全部楼层
cjr82123 发表于 2014-12-9 15:37
使用QP后,的确,程序的耦合度明显下降。但是我的程序还是存在几个全局变量,
我在想是否可把全局变量A放 ...

关于QP能给个简单的例子示范下QP的设计么?
光看官网上的Blinky,感觉离具体应用太远,还是不理解

出0入0汤圆

发表于 2014-12-17 23:29:21 | 显示全部楼层
好深奥哟,得慢慢领会一下才行,反正现在看人家的代码,用心的话也能明白,但其中的好处还没有去深究

出0入0汤圆

发表于 2014-12-18 00:30:33 来自手机 | 显示全部楼层
有些可以用静态的局部变量

出0入0汤圆

发表于 2014-12-18 08:33:46 | 显示全部楼层
Free_Bird 发表于 2014-12-17 22:03
关于QP能给个简单的例子示范下QP的设计么?
光看官网上的Blinky,感觉离具体应用太远,还是不理解 ...

建议你先认真细读《PSiCC2-CN .pdf》。

出0入0汤圆

发表于 2014-12-18 08:51:14 | 显示全部楼层
现在只能做到限制在文件内,static

出0入0汤圆

发表于 2014-12-18 11:57:24 | 显示全部楼层
感谢楼主

出0入0汤圆

发表于 2014-12-18 13:52:29 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2014-12-25 20:41:10 | 显示全部楼层
mark,程序设计的结构与模块化。

出0入0汤圆

发表于 2014-12-25 21:27:25 | 显示全部楼层
慢慢学习了。谢谢各位前贤!

出0入0汤圆

发表于 2014-12-25 21:42:42 来自手机 | 显示全部楼层
topdog 发表于 2014-10-1 23:40
太多的全局换一拨人后,维护他就是灾难。

换人是老板做的事,维护是你做的事,不然薪水拿什么理由加呢?

出0入0汤圆

发表于 2014-12-26 14:32:38 | 显示全部楼层
学习了 嘿嘿

出0入0汤圆

发表于 2014-12-26 15:41:28 | 显示全部楼层
那就全局变量吧 没办法。。。。

出0入0汤圆

发表于 2014-12-31 10:23:00 | 显示全部楼层
我也是全局变量满天飞
下一步尝试封装到结构体吧
关键还是要多写,多看
才能理解大神门用的方法

出0入0汤圆

发表于 2015-1-10 10:38:51 | 显示全部楼层
heyj6969 发表于 2014-9-28 17:05
使用结构体分类,把全局变量放在一个.c里面,如果外部函数要调用的话,就使用相应API。这样变量就不会满天 ...

高手,想请教一下,get_para() he set_para() 怎么实现?能举个例子不 ?谢谢

出0入0汤圆

发表于 2015-1-10 12:03:14 | 显示全部楼层
回复很给力,学习了,我还是觉得2楼的方法很不错,

出0入0汤圆

发表于 2015-1-31 17:23:23 | 显示全部楼层
可以选择用函数内部的静态变量传到另一个文件中重新赋值的给一个静态的全局变量,这样就能把全局变量尽量集中了

出0入0汤圆

 楼主| 发表于 2015-3-10 09:49:55 | 显示全部楼层
牙膏 发表于 2015-1-31 17:23
可以选择用函数内部的静态变量传到另一个文件中重新赋值的给一个静态的全局变量,这样就能把全局变量尽量集 ...

谢谢,尽量把变量的作用域控制在模块或函数内部

出60入0汤圆

发表于 2015-3-13 23:49:58 | 显示全部楼层

请问是怎么实现的

出60入0汤圆

发表于 2015-3-13 23:50:53 | 显示全部楼层
lyricpoem0726 发表于 2015-1-10 10:38
高手,想请教一下,get_para() he set_para() 怎么实现?能举个例子不 ?谢谢

同问,谢谢

出0入0汤圆

发表于 2015-8-24 14:57:46 | 显示全部楼层
谢谢,mark再看

出0入0汤圆

发表于 2015-8-24 15:54:29 | 显示全部楼层
我这样实现,请高手批评指正下,谢谢

#define GET_AND_SET_FUNC( type, var )\
        type  g##var; \
        type Get##var() {return g##var;} \
        void Set##var( type  _x ) { g##var = _x;}
#define DECLARE_FUNC( type, var )\
        extern type Get##var( void );\
        extern void Set##var( type );

定义与声明:
GET_AND_SET_FUNC( uint16_t, FanSetSpeed );//风机设置风速
GET_AND_SET_FUNC( uint16_t, FanSetOnOff );//风机设置开关
DECLARE_FUNC( uint16_t, FanSetSpeed );
DECLARE_FUNC( uint16_t, FanRunTime );

给值  SetFanSetSpeed(uint16_t DesireValue )
引用  DesireValue =GetFanSetSpeed()

出0入0汤圆

发表于 2015-8-24 15:59:22 | 显示全部楼层
尽量少用,按属性归类,缩小作用范围。

出0入25汤圆

发表于 2015-8-24 19:19:32 | 显示全部楼层
typedef 发表于 2014-9-28 17:27
这个“最怕在多个模块中直接操作全局变量,这样会把各个模块之间的逻辑关系搞复杂!”

才是我现在最头痛 ...

做到一个生产者,多个消费者就好控制了。

出0入0汤圆

发表于 2015-8-28 17:26:18 | 显示全部楼层
vincero 发表于 2015-8-24 15:54
我这样实现,请高手批评指正下,谢谢

#define GET_AND_SET_FUNC( type, var )\

这样的思路挺好的

出0入0汤圆

发表于 2015-8-28 22:37:30 | 显示全部楼层
学习了 之前没怎么管这问题

出0入0汤圆

发表于 2015-8-28 23:31:09 | 显示全部楼层
以前上学的时候老师也说过类似的问题,尤其是程序模块化 并且由不同的人来写的时候,全局变量就乱了

出0入0汤圆

发表于 2015-8-29 09:47:00 | 显示全部楼层
vincero 发表于 2015-8-24 15:54
我这样实现,请高手批评指正下,谢谢

#define GET_AND_SET_FUNC( type, var )\

这种方法不错

出0入0汤圆

发表于 2015-8-29 09:50:32 | 显示全部楼层
vincero 发表于 2015-8-24 15:54
我这样实现,请高手批评指正下,谢谢

#define GET_AND_SET_FUNC( type, var )\

请教,如果我要定义一结构体(结构体里很多变量),能否用类似宏方法实现?

出0入0汤圆

发表于 2015-11-14 14:16:59 | 显示全部楼层
echoecho_cxp 发表于 2014-9-28 17:23
我感觉用用也没什么关系。
关键是保持头脑清醒

如果是一个月之后,就不能头脑清晰了。

出0入0汤圆

发表于 2015-11-14 14:21:33 | 显示全部楼层
nutos 发表于 2014-9-28 17:55
我是将全局变量放在一个文件中做定义,有逻辑关系的定义成结构体

我也是这样做的

出0入0汤圆

发表于 2015-11-15 00:12:52 | 显示全部楼层
vincero 发表于 2015-8-24 15:54
我这样实现,请高手批评指正下,谢谢

#define GET_AND_SET_FUNC( type, var )\

查了一下知道##在这里的用法,这个宏定义也大致明白了,但是应该要怎么用才对,你GetFanSetSpeed(uint16_t  xxx)之后xxx的值是 gFanSetSpeed,那gFanSetSpeed又是什么,你这个宏要怎么样应用到实际的代码中去。
烦请讲解一下

出0入0汤圆

发表于 2015-11-17 11:12:43 | 显示全部楼层
blavy 发表于 2015-11-15 00:12
查了一下知道##在这里的用法,这个宏定义也大致明白了,但是应该要怎么用才对,你GetFanSetSpeed(uint16_ ...

给值  SetFanSetSpeed(uint16_t DesireValue )
引用  DesireValue =GetFanSetSpeed()

出0入0汤圆

发表于 2015-11-17 14:10:17 | 显示全部楼层
全局变量并无不妥

出0入0汤圆

发表于 2015-11-17 18:42:58 | 显示全部楼层
vincero 发表于 2015-11-17 11:12
给值  SetFanSetSpeed(uint16_t DesireValue )
引用  DesireValue =GetFanSetSpeed()

有没有详细点的程序段,想象不过来

出0入0汤圆

发表于 2015-11-20 16:26:12 | 显示全部楼层
使用的是2楼说的方法,对于一个特性的多个参数一般使用的也是用结构体整合

出0入0汤圆

发表于 2015-11-20 17:26:21 | 显示全部楼层
以前总是用结构体封装模块变量,避免混乱,听了大家的,把一些变量放到函数内用static定义,是清爽了很多,不过还是摆脱不了全局变量。习惯了用结构体。

出0入0汤圆

发表于 2015-11-23 14:51:54 | 显示全部楼层
blavy 发表于 2015-11-15 00:12
查了一下知道##在这里的用法,这个宏定义也大致明白了,但是应该要怎么用才对,你GetFanSetSpeed(uint16_ ...

看了下 :

用了这个宏

举例

GET_AND_SET_FUNC( unsigned short, FanSetSpeed );

等于以下代码

unsigned short gFanSetSpeed;

unsigned short GetFanSetSpeed()
{
        return gFanSetSpeed
}

void SetFanSetSpeed(unsigned short  x)
{
        gFanSetSpeed=x;

}

出0入0汤圆

发表于 2016-3-7 14:33:39 | 显示全部楼层
为每个模块创造输入输出接口,用字符串来连接这些接口,需要的参数操作用函数来操作。

出0入0汤圆

发表于 2016-4-19 11:29:05 | 显示全部楼层
最近我在一个模块内做了一个循环队列,这个队列用来传递消息,就叫消息队列。写完了它之后,函数和函数之间感觉都很独立。
也就是消耦了。其实全局变量并没有减少,只是变成了生产者-消费者的模式独立成了一个模块了。在没有实现消息队列之前,我以
为消息队列可以减少全局变量的使用,现在明白它主要是用来消耦的。要减少全局变量的使用,关键还是看算法。

出0入0汤圆

发表于 2016-4-19 13:25:14 | 显示全部楼层
全局变量不知要如何改成局部变量,每次很多变量都有用到,传来传去又用回全局变量...

出0入0汤圆

发表于 2016-4-19 14:32:45 | 显示全部楼层
好长,看了2小时才看完,学习了!

出0入0汤圆

发表于 2016-4-19 16:05:16 | 显示全部楼层
学习了,我是新新手,现在还顾不上。

出0入10汤圆

发表于 2016-4-19 16:23:00 | 显示全部楼层
学习了,以前没有注意这块

出0入0汤圆

发表于 2016-4-20 13:32:20 | 显示全部楼层
2楼的建议不错

出0入0汤圆

发表于 2016-4-20 13:39:05 | 显示全部楼层
程序复杂的还是封装一下,简单的无所谓

出0入0汤圆

发表于 2016-4-20 13:50:57 | 显示全部楼层
foxpro2005 发表于 2014-9-29 14:03
比如像用于配置的“参数”类的变量, 一般情况下这类模块中的变量会比较多。
这种情况,如果单独封装每个变 ...

同意

出0入0汤圆

发表于 2016-4-20 14:17:24 | 显示全部楼层
Gorgon_Meducer 发表于 2014-11-3 10:45
就应该是这种方式,赞!做事很专业哈!

非常赞同,程序写之前一定要想好了。现在不会轻易用全局变量。

出0入0汤圆

发表于 2016-4-20 15:04:58 | 显示全部楼层
来涨知识

出0入0汤圆

发表于 2016-5-13 21:05:32 来自手机 | 显示全部楼层
我们现在做的项目,客户要求全局变量0,圈复杂度15以下,静态路径数80,嵌套深度4.

出0入0汤圆

发表于 2016-5-14 09:42:06 | 显示全部楼层
少用全局变量的原因是不同的函数关联度太高,修改代码的时候容易出错。
可是工程上的事情别太拘泥于死板的规则,学会在什么情况下放松什么样的规则才能成为高手。
如果业务复杂,多个函数都需要用到同样一些变量,写在参数里不如写成全局变量更方便更少出错修改更容易。
要是害怕搞乱,可以分成多个不同的模块,不同的模块使用不同的全局变量。比如采集数据的和数据处理的就可以放在一个模块里。
还有,项目是你一个人写的时候用多些全局变量问题不大,如果是多人协作开发,全局变量使用就要小心很多。
不同的实际情况,有不同的处理方法,太死板了水平就提高不了啦

出0入0汤圆

发表于 2016-5-14 09:51:35 | 显示全部楼层
也经常使用全局变量

出0入0汤圆

发表于 2016-5-20 09:24:23 | 显示全部楼层
收藏下,62楼的方式学习下!!

出0入0汤圆

发表于 2016-5-20 14:36:27 来自手机 | 显示全部楼层
学习了,谢谢!

出0入12汤圆

发表于 2016-5-20 14:53:53 | 显示全部楼层
farfar 发表于 2014-9-28 16:48
不用全局變量也不是不可以,但是要犧牲Flash空間,多一些額外的RAM,還有多一些執行時間。
一刀切也不好, ...

inline 和编译器优化可以解决这个问题。

出0入0汤圆

发表于 2016-5-20 15:55:55 | 显示全部楼层
abutter 发表于 2016-5-20 14:53
inline 和编译器优化可以解决这个问题。

inline無法跨文件調用

出0入12汤圆

发表于 2016-5-20 16:21:09 | 显示全部楼层
farfar 发表于 2016-5-20 15:55
inline無法跨文件調用

inline 的函数放在头文件中,跨文件调用就直接包含头文件。

出0入0汤圆

发表于 2016-5-20 16:26:15 | 显示全部楼层
abutter 发表于 2016-5-20 16:21
inline 的函数放在头文件中,跨文件调用就直接包含头文件。

這也算是一種方法。
只是把代碼寫在頭文件中總感覺有點怪怪的。

出0入0汤圆

发表于 2016-5-20 16:49:17 | 显示全部楼层
这个帖子比较专业  学习

出0入12汤圆

发表于 2016-5-20 20:53:05 | 显示全部楼层
farfar 发表于 2016-5-20 16:26
這也算是一種方法。
只是把代碼寫在頭文件中總感覺有點怪怪的。

头文件跟 c 文件没有本质区别。

出0入0汤圆

发表于 2016-6-15 13:57:44 | 显示全部楼层
学习消化中

出0入0汤圆

发表于 2016-6-17 11:46:39 来自手机 | 显示全部楼层
很强的技术帖子,学习中。

出0入0汤圆

发表于 2016-6-19 21:57:45 | 显示全部楼层
收获很多

出0入0汤圆

发表于 2016-7-8 13:34:05 | 显示全部楼层
标记,学习一下

出0入0汤圆

发表于 2016-7-28 13:33:44 | 显示全部楼层
标记,需要时间消化。。

出0入0汤圆

发表于 2016-9-21 20:02:16 | 显示全部楼层
相当不错,又学习了新技能

出0入0汤圆

发表于 2016-9-27 02:29:23 | 显示全部楼层
vincero 发表于 2015-8-24 15:54
我这样实现,请高手批评指正下,谢谢

#define GET_AND_SET_FUNC( type, var )\

感觉挺好,感谢分享

出0入0汤圆

发表于 2016-10-10 15:48:26 | 显示全部楼层
我一般都是用结构体封装起来,比较清晰

出0入0汤圆

发表于 2016-10-10 17:02:52 | 显示全部楼层
用C++编程.

出0入0汤圆

 楼主| 发表于 2016-10-22 17:35:15 | 显示全部楼层
cc224 发表于 2016-5-14 09:42
少用全局变量的原因是不同的函数关联度太高,修改代码的时候容易出错。
可是工程上的事情别太拘泥于死板的 ...

确实,有时候,该用的地方还是要用的。只是不要滥用就行,并且命名一定要规范化,做好详细的注释等

出0入46汤圆

发表于 2016-10-22 20:10:08 | 显示全部楼层
用好结构体和指针,就能解决你的问题

出0入0汤圆

发表于 2017-12-13 10:00:44 | 显示全部楼层
foxpro2005 发表于 2014-9-29 14:03
比如像用于配置的“参数”类的变量, 一般情况下这类模块中的变量会比较多。
这种情况,如果单独封装每个变 ...

如果在应用中, 仅需要修改其中一个参数怎么办呢?  其实很简单, 根据上面的类似的方法修改, 增加基于 “基地址偏移量” 读/写的接口函数即可。

如果再增加一个para4,或者把para1和para2的位置互换了,“基于 “基地址偏移量” 读/写的接口函数”这种方式是不是就不好用了?
比如把para1和para2的位置互换,那么在其他调用到para1和para2的函数都需要重新去修改一下~~

出0入0汤圆

发表于 2017-12-13 16:37:43 | 显示全部楼层
整个楼看完了,感觉大多数人没有弄明白为什么要减少全局变量,或者应不应该减少全局变量。
为什么要减少全局变量,个人理解这样做并不是为了程序代码的优化,而是增加整体的可维护性,以及为更高级的功能做基础。
可维护性52楼的例子就很明白,一个全局变量,一搜索,500多个地方对它进行了读写,这样的代码别说维护了,看懂都困难。而更高级的功能基础,常见的如8位机里使用int或者long时,遇到的中断临界问题,那么这个时候用119楼的代码,在"原子操作的保护宏"里写个关中断,或者再扩展一下做个读写权限检查,都能让代码整齐划一。

要不要减少全局变量,这个还是要从实际出发了,我自己在用全局变量时,会遵循下面几个原则,当这些原则都满足的时候,其实全局变量就不多了
1.这项目就你一个人开发,没有多人协同开发,也不需要把这个项目里的内容给别人
2.全局变量在整个程序中只能有一个地方写,其余地方只能读
3.规范命名,名称能反映出变量的用途,并且同样用途的变量格式框架必须一致
4.全局变量必须有清晰的注释

出0入296汤圆

发表于 2017-12-13 18:34:45 | 显示全部楼层
liansh2002 发表于 2017-12-13 16:37
整个楼看完了,感觉大多数人没有弄明白为什么要减少全局变量,或者应不应该减少全局变量。
为什么要减少全 ...

再补充一点,全局变量会阻止某些编译器优化。多用static (private)可以增加编译器优化代码的机会。

出0入0汤圆

发表于 2017-12-13 19:41:07 | 显示全部楼层
学习了。。。

出0入0汤圆

发表于 2018-4-27 21:30:28 | 显示全部楼层
全局变量中断读写冲突容易错啊

出0入0汤圆

发表于 2018-4-28 09:26:01 | 显示全部楼层
跟大神学习一下

出0入0汤圆

发表于 2018-4-29 10:13:41 | 显示全部楼层
这是个奢侈的追求

出0入0汤圆

发表于 2018-5-18 20:34:58 | 显示全部楼层
灵活一点,太拘泥于规则了

出0入0汤圆

发表于 2018-5-18 21:34:59 | 显示全部楼层
liansh2002 发表于 2017-12-13 16:37
整个楼看完了,感觉大多数人没有弄明白为什么要减少全局变量,或者应不应该减少全局变量。
为什么要减少全 ...

全局变量完全可以避免。

全局变量有两个问题:
1、调用次数太多,无法维护。
2、多任务修改变量,造成数据混乱。

描述一下吧:、
1、如果代码比较少,定几个全局变量也无不可。但上面说了有500多个地方调用,代码体量可想而知。所以我只说代码量教大,不怎么需要考虑flash空间情况下。
2、linux多任务系统做过的人可能会更清楚一些,任务之间的共享数据都会进行到临界区,进行互斥保护。
单片机系统中也是如此,一般认为单片机是前后台系统,至少有两个任务:1、while(1)任务(后台任务),2、还有中断任务(前台任务)。

针对1的解决方案:
1、这种情况下,一般是会增加一些代码量,多牺牲一些代码空间,把整体的功能进行拆分。确保没有需要用到全局变量的地方。
2、举个例子:如果一定要说必须有一个变量指示当前所有初始化完毕:
bool bInited = false;
定义一个系统管理模块,并在里面定义针对他的两个接口,并
void setInit(bool) / bool getInit()
其他模块必须调用这两个接口。其他模块不关心bInited变量本身,只关心接口。

3、模块间耦合的方式有很多种,向上述的直接调用,也可以用回调的方式。其实也都是函数指针。
4、模块的编译,在linux、wins下会编译成库,在单片机下,最好也是类似的方式,至少按照文件夹区分开。
5、模块的思想实际上类似C++面向对象的思想,C++建议可以非常熟悉一下。对于大型项目的开发,多人联合开发,其思想非常有帮助。比较好的C开源代码,也都是以完全近似对象的方式进行开发,比如linux源码。
6、模块的规划,实际上是业务的规划,对经验要求较高。项目写一遍,不行总结一下再写一遍,总会慢慢提高。但是单片机项目一般一锤子,写完不会改动,只能靠项目积累。
7、模块的方式,会增加非常多的代码量。好的模块,可以单独进行单元测试,不需要依赖其他模块。所有经过单元测试的模块拼装起来,最终的完成度非常高。可维护性也强。

针对2的方案:
1、volatile可以解决部分变量问题。
2、针对struct的修改,可以转化为volatile的问题,在其中的一个任务中进行修改。也就是避免多任务修改。

洋洋洒洒,从来没总结过那么多。

出0入0汤圆

发表于 2018-5-19 09:18:34 | 显示全部楼层
dxgdsx 发表于 2014-9-28 16:06
使用一个get_xxx和set_xxx接口函数应该可以防止全局变量漫天飞吧。

me too !

出0入0汤圆

发表于 2018-5-31 14:37:07 | 显示全部楼层
帖子挺长,我看完了

出0入0汤圆

发表于 2018-7-26 15:37:39 | 显示全部楼层
我也看完了 不错

出0入296汤圆

发表于 2018-7-26 18:30:59 | 显示全部楼层
gshuang1 发表于 2014-10-1 16:28
可以读下开源操作系统的代码。只要做到全局变量用结构体归好类,一个函数要是涉及到操作外部变量的尽量用指 ...

一两个工程事儿小,养成了还习惯事儿大!

出0入0汤圆

发表于 2018-7-26 20:11:20 | 显示全部楼层
dxgdsx 发表于 2014-9-28 16:06
使用一个get_xxx和set_xxx接口函数应该可以防止全局变量漫天飞吧。

不用全局变量的主要原因在于怕不知道在哪里读取和修改了这个全局变量,尤其多人开发维护时,你要快速修改代码会发现全局变量值被其他人代码莫名其妙改变了,却很难追踪到修改点,甚至变量一多名字搞混了,误调用了
所以封装过一层读写函数,可以根据调用地址追溯调用点,函数名可以复杂些,输入输出做下限制

出0入0汤圆

发表于 2018-11-16 01:09:18 来自手机 | 显示全部楼层
茅塞顿开,非常有用

出0入0汤圆

发表于 2018-11-18 17:34:56 | 显示全部楼层
现在正改变使用全局变量的习惯

出0入0汤圆

发表于 2018-12-16 16:53:25 | 显示全部楼层
使用一个get_xxx和set_xxx接口函数,这个简单好理解。哈哈。。

出0入0汤圆

发表于 2018-12-16 19:51:58 | 显示全部楼层
2L的方法很赞,模块化编程深有体会。

看到get_xxx() set_xxx() 就知道其他是外部模块的接口,还能全局搜索那些地方用了这些接口,不用怕改一个全局变量提心吊胆了。

出0入0汤圆

发表于 2021-1-17 22:48:08 | 显示全部楼层
mark 慢慢体会

出0入0汤圆

发表于 2021-1-18 11:22:44 | 显示全部楼层
学习,体会。

出0入0汤圆

发表于 2021-1-18 15:36:19 | 显示全部楼层
学习一下试试

出105入79汤圆

发表于 2021-12-14 23:44:45 | 显示全部楼层
c++用class包起来, c语言用struct
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-18 15:51

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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