打印

不提倡使用全局变量,2k数据该怎么办啊?所长出出招!

[复制链接]
楼主: zhuhai2004
手机看帖
扫描二维码
随时随地手机跟帖
61
machunshui| | 2007-12-26 11:31 | 只看该作者 回帖奖励 |倒序浏览

说得好

"如果非得分割清晰的,代价也很大"

说得好,这是根本!
存在一定有其合理的地方.不能一概而论.

使用特权

评论回复
62
showyou| | 2007-12-26 16:21 | 只看该作者

回复主题:不提倡使用全局变量,2k数据该怎么办啊?所长出

这个不太清楚,我是来学习的。

使用特权

评论回复
63
lenglx| | 2007-12-26 17:13 | 只看该作者

呵呵

呵呵,这个问题的反响这么大。
以我个人而言,使用不使用全局变量,完全是编程者自己的事情,可以看情况而定。

但使用全局变量,至少我知道会(也可能不会)发生这样的事情:

比如你使用了一个全局变量,象下面这样:
// file1.c
UINT    gVal;

// file2.c
extern UINT gVal;
void func(..)
{
    // 修改或者使用gVal
}

// file3.c
extern UINT gVal;
void func(..)
{
    // 同样修改或者使用gVal
}

现在,一切很好。

忽然某一天,你的客户告诉你说。现在他需要将这个gVal做成log,保存到硬盘上,因为他需要分析这些数据。
你怎么做?
如果使用gVal的地方不多,还好办。如果这样的地方很多,那么找到所有的这些地方,并且修改它们,是枯燥的,而且容易出错。
如果你事先将gVal的存取做成一个函数,那么你只需要更改那个存取的函数就可以了。
// file1.c
static UINT gVal;
void SetVal(UINT val)
{
    // 将数据保存到log文件
}

// file2.c
extern void SetVal(UINT val);
void func(..)
{
    // 调用 SetVal() 来修改gVal
    // 现在,这部分程序不需要改动
}

又或者,你这个gVal是一个需要根据外部数据来进行一些复訮OSThttps://bbs.21ic.com/club/bbs/SaveReAnnou闹担

使用特权

评论回复
64
将军令| | 2007-12-28 09:54 | 只看该作者

不提倡 不等于就禁止了!

使用特权

评论回复
65
tjsheep| | 2007-12-28 18:56 | 只看该作者

lenglx同志说得很好,努力顶一个

再多问一句:
如果不是全局大块的数据的情况,而是一些小的,零散的全局的标志位,访问的地方很多,访问也很频繁,如果也封装起来,用一些接口函数来读取,是不是效率太差一点了。尤其在快速中断中,对某些标志变量的判断还是需要的,而节约每一条指令的时间对提高中断的响应能力都是有好处的。各位高人有何好的建议?

使用特权

评论回复
66
lenglx| | 2007-12-28 20:24 | 只看该作者

象这种情况,

C++中,有inline函数可以使用。
一般的C编译器,也提供一个类似inline函数的机制,比如一个额外的关键字,象__inline什么的。

象你说的这种情况,可以先做成inline函数,在效率上,跟你使用全局变量没什么区别。一旦以后你发现需要控制这个变量存取时候的行为,你可以很方便的修改你的程序。

如果编译器没有提供inline的机制可以用。你也可以利用宏仿真inline函数。

//.h
extern UINT gVal1;
#define PutVal1(val) { gVal1 = val;}
#define GetVal1() gVal1

不过这样做,就失去了语言本身的类型检查能力。而且一旦出现错误,不太好检查。因为PutVal1, GetVal1是一个宏,它们不会作为符号名称存在于目标文件中。
但让你获得一个可以修改gVal1的定制行为的灵活性。如果你以后要改变PutVal1(), GetVal1()的行为,你可以很方便地将它们改成函数。

至于你要不要选择这样的宏,还是那句话:这完全是个人的行为。

使用特权

评论回复
67
Cortex-M0| | 2011-10-24 17:24 | 只看该作者
好贴要多顶顶~~~

使用特权

评论回复
68
dong_abc| | 2011-10-24 20:10 | 只看该作者
顶楼上,顶所长。

使用特权

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

本版积分规则