嵌入式c语言中static的应用场合(嵌入式C语言中关键字static的用法)

我们在嵌入式开发中,用static声明的变量,会有两方面的特征:

1、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候,还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。

2、变量用static定义后会告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。

static的应用场景

关键字static主要有以下两个应用场景:

1、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度。

2、若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度。

实际上我们可以发现,定义static变量的好处,除了降低模块间的耦合度外,也保证了变量的密封性,而且不占用堆栈空间。不会出现因静态全局变量过大,而导致堆栈溢出的情况。

嵌入式c语言中static的应用场合(嵌入式C语言中关键字static的用法)(1)

堆栈溢出

但是,定义static变量也会存在一个问题。

不可重入函数

我们在设计和使用访问动态全局变量、静态全局变量和静态局部变量的函数时,需要考虑重入问题。比如,

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变量。

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

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

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页