变量和类型

全局变更也称为外部变量,它不属于某一个函数,而是属于一个源程序文件。

如果要另外一个文件中使用在另一个文件中定义的全局变量,要使用extern说明符进行声明。

即使是在同一个文件中使用全局变量,如果该变更定义在某个函数之后,也要用extern说明符进行说明。

外部变量的定义和外部变量的声明(说明)并不是一回事。外部变量只能定义一次。外部变量在定义时就已分配了内存单元,外部变量定义可做初始赋值,外部变量声明不能再赋初始值。

外部变量的定义:

extern 类型说明符 变量名,变量名……;   其中方括号中的extern 可以省去不写。

 

  • 变量的存储方式可分为静态存储和动态存储两种。
  • 静态存储方式是在变量定义时就分配存储单元并一直保持不变,直到程序结束。
  • 动态存储变量是在程序执行过程中使用它时才分配存储单元,使用完毕立即释放。典型的动态存储方式的例子是函数形式参数。如果一个函数被多次调用,则反复地分配、释放存储单元。

静态存储变量是一直存在,而动态存储变量则里面存在里面消失。我们把这种由于变量存储方式不同而产生的特性称为变量生存期。

一个变量究竟属于哪一种存储方式,并不能仅从其作用域判断,还应有明确的存储类型说明。

C++存储类型说明符: auto /register /extern /static   前两者是动态存储方式。外部变量和静态变量属于静态存储方式。

 

请谨记:

  • 若全局变量只在单个C文件中访问,则可以将这个变更修改为静态全局变量,以降低模块 间的耦合度。
  • 若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
  • 设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;

问题:不可重入函数

  曾经设计过如下一个函数,在代码检视的时候被提醒有bug,因为这个函数是不可重入的,为什么?

unsigned int sum_int( unsigned int base )
{
 unsigned int index;
 static unsigned int sum = 0; // 注意,是static类型的。
 for (index = 1; index <= base; index++)
 {
  sum += index;
 }
 return sum;
}

答案与分析:

  所谓的函数是可重入的(也可以说是可预测的),即:只要输入数据相同就应产生相同的输出。
  这个函数之所以是不可预测的,就是因为函数中使用了static变量,因为static变量的特征,这样的函数被称为:带“内部存储器”功能的的函数。因此如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量,这种函数中的static变量,使用原则是,能不用尽量不用。

  将上面的函数修改为可重入的函数很简单,只要将声明sum变量中的static关键字去掉,变量sum即变为一个auto 类型的变量,函数即变为一个可重入的函数。

  当然,有些时候,在函数中是必须要使用static变量的,比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

可重入函数_互动百科
http://www.baike.com/wiki/%E5%8F%AF%E9%87%8D%E5%85%A5%E5%87%BD%E6%95%B0

 

tip:跳过无意义的default构造行为。   延迟定义

转载于:https://my.oschina.net/ray1421/blog/638627

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值