c语言全局变量链接效率,c语言中的全局变量问题

猛然间从前不是问题的问题成为了最主要的问题:c语言中的全局变量。

可能大家对这个不是太了解,因为无论是老师说的还是课本上印的都是尽量少使用全局变量。之前从考试的角度说对这句话有印象,不过当用的时候早就抛九霄云外了。所以一直没留意。如果仔细观察你会发现在单片机编程中充斥着各种各样的全局变量甚至是全局变量的初始化,由于本人能力有限,所以解决这两个问题主要是引述在论坛上各位大虾的言论。以此来自勉以及为日后的复习工作做准备。

1全局变量,据说你很危险?

第一点:我不同意楼上几位关于全局变量和单件模式的论述,虽然单件模式是通过全局变量实现的,但是很明显全局变量并不等于单件模式 听你们说的总感觉很别扭,...

全局变量有很多弊端,比如说全局变量维护起来不是那么清晰,别人看你的代码也会觉得不那么直接,如果很多地方用到,到处都是extern,处理中如果出了问题,排查也增加了自己的复杂

?

所以说应该尽量避免使用,但也不是绝对不能用,当有些时候想不到更好的替代方案时,该用还是要用,另外goto语句也是一样。

存在及合理,但只有在合适的情况下才使用,比如为了提高效率,在单片机程序,arm程序,dsp程序里面,全局变量满天飞

不过在pc机上,随着机器性能越来越高,这个已经不是最关注的问题,设计者更应注重程序的可维护性和可扩展性,而全局变量往往会破坏这些,所以应尽量避免。

人生都是在取舍 程序 ,全局变量的使用根据你的情况自己考虑是用还是不用。

如果变量使用不多 获取指针又比较方便 为了安全起见 还是定义成局部的好。

以前敏捷开发的要求要重构。说函数要短,可复用性要高。我也以为这是圣经。后来到了单片机里这样做就是傻瓜了。因为单片机里边进一个函数就要进栈出栈,白白浪费时钟周期,本来没必要的函数调用能省就省了。而且很多时候根本没有那么多临时存储的地方给你用。想疯狂调用函数,玩个递归啥的,还是免了吧。。。全局变量么,能用就用吧。因为如果全局就占一个存储空间,分散了之后没准就需要几个。划不来。变量名字也往短了起,计算上的东西就已经很头大了,再搞一堆长长的名字真是打扰心情。还有中断,才知道多么珍贵,要严格控制不要两个同时进来,而且中断函数不能重入。。。反正,具体应用很关键。不能形而上学。。。

控制全局变量的总量,太多了要出麻烦

全局变量是一把双刃剑,?使用全局变量还是指针来作为函数数据访问的接口要看什么时候、怎么用还要自己慢慢摸索。

2.全局变量的初始化

关于全局变量的初始化,c语言和c++是有区别的。在c语言中,只能用常数对全局变量进行初始化,否则编译器会报错。在c++中,如果在一个文件中定义了int a = 5;...

对于不同编译单位的全局变量,其初始化的顺序没有任何的保证,因此对不同编译单位里的全局变量,在它们的初始化顺序之间建立依赖性都是不明智的。

此外也没办法捕捉到全局变量初始化抛出的异常,一般来说要减少全局变量的使用,特别是限制那些要求复杂初始化的全局变量。so: 1,尽量不用全局变量

2,用静态变量,通过访问器进行访问

例如:全局变量

int a = 5;

int b = a;

如果a,和b定义在同一个文件里,那没什么问题,结果b等于5.

如果a和b定义在不同文件里,就不能保证b也等于5,也就是说不能保证a先初始化.

事实上,除了在同一个文件定义的全局对象的初始化是按照定义次序来进行的之外,其他全局或静态变量之间的初始化次序没有任何保障。解决这种问题的方法是不直接使用全局变量,而改用一个包装函数来访问,例如

int get_a()

{

static int a = 5;

return a;

}

int get_b()

{

static int b = get_a();

return b;

}

这样的话,无论get_a和get_b是否定义在同一个文件中,get_b总是能够返回正确的结果,原因在于,函数内部的静态变量是在第一次访问的时候来初始化。

任何时候,如果在不同的被编译单元中定义了"非局部静态对象",并且这些对象的正确行为依赖于它们被初始化的某一特定顺序,就会产生问题.你绝对无法控制不同被编译单元中非局部静态对象的初始化顺序.对于函数中的静态对象(即"局部"静态对象)它们在函数调用过程中初次碰到对象的定义时被初始化..

PS:千万不要写出和编译顺序相关的程序来。

关于全局变量的初始化,C语言和C++是有区别的。

在C语言中,只能用常数对全局变量进行初始化,否则编译器会报错。

在C++中,如果在一个文件中定义了int a = 5;要在另一个文件中定义int b = a;的话,前面必须对a进行声明:extern int a;否则编译不通过.、即使是这样,int b = a;这句话也是分两步进行的:在编译阶段,编译器把b当作是未初始化数据而将它初始化为0;在执行阶段,在main被执行前有一个全局对象的构造过程,int b = a;被当作是int型对象b的拷贝初始化构造来执行。

其实,准确地说,在C++中全局对象、变量的初始化是独立的,如果不是象int a = 5;这样的已初始化数据,那么就是象b这样的未初始化数据。

而C++中全局对象、变量的构造函数调用顺序是跟声明有一定关系的,即在同一个文件中先声明的先调用。对于不同文件中的全局对象、变量,它们的构造函数调用顺序是未定义的,取决于具体的编译器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值