汉扬编程 C语言入门 嵌入式C语言中关键字static的用法

嵌入式C语言中关键字static的用法

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

嵌入式C语言中关键字static的用法

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

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

static的应用场景

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

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

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

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

堆栈溢出

但是,定义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类型,则返回为错误指针。

浅谈C语言的static关键字

文章为自己的学习总结,如有不对还请指出~

static是C语言中是比较常用的关键字,下面就对static的用法进行简单的分析。

变量1.块作用域的静态变量(静态局部变量)

你也许听过静态变量这一次,听起来似乎有些自相矛盾,像是一个不可变的变量。实际上,静态的意思是该变量在内存中原地不动,并不是说它的值不变。具有文件作用域的变量具有静态存储期,C语言通过static关键字声明变量(在函数内),该变量具有块作用域、无连接,但是具有静态存储期,这些变量和自动变量一样具有相同的作用域,但是程序在离开它们所在的函数内,这些变量并不会消失。

下面通过一个程序说明其具体用法:

#include <stdio.h>void fun();​int mian(){    int i ;    for (i = 1; i <= 3; i++)   {        printf("第%d次循环:\\n", i);        fun();   }    return 0;}​void fun(){    int x = 1;    static int static_x = 1;    printf("x = %d\\tstatic_x = %d\\n", x++, static_x++);}运行结果:

第1次循环:x = 1   static_x = 1第2次循环:x = 1   static_x = 2第3次循环:x = 1   static_x = 3分析:

由运行结果可知,静态局部变量具有和全局变量类似的作用——在离开其声明的函数体后,它的值仍保持不变,但它仍是位于函数内部。而普通的局部变量,每执行一次函数就会被重新赋值一次。

2.内部链接的静态变量(全局静态变量)

这种变量定义在函数体外部,具有静态存储期,文件作用域和内部链接。普通全局变量对整个项目文件都是可见的,在A文件定义的变量可以通过extern关键字声明后使用,其他文件不能定义与其同名的变量。

但是在加上了static关键字后,该变量就仅对当前文件可见了,其他文件可以定义与其同名的变量。这样做的好处是可以大大的降低程序模块之间的耦合。

函数静态函数的使用方法与全局静态变量类似,在函数的返回类型前加上static,即为静态函数,只对当前文件有效,其他文件不能应用该函数。

非静态函数可以在另一个文件中直接引用,可以不添加extern关键字

下面通过一个程序来做演示:

//file1.c#include <stdio.h>​static void fun();​int main(){    fun();    fun1();    return 0;}​static void fun(){    printf("I am in fun.\\n");}//file2.c#include <stdio.h>​static void fun1(){    printf("I am in fun1.\\n");}在visual studio 2019中运行后,产生如下错误报告:

警告 C4013 “fun1”未定义;假设外部返回 int texs1 错误 LNK2019 无法解析的外部符号 _fun1,函数 _main 中引用了该符号错误 LNK1120 1 个无法解析的外部命令 对file2.c文件进行如下修改后:

//file2.c#include <stdio.h>​void fun1(){    printf("I am in fun1.\\n");}运行程序,程序正常并得到如下结果:

I am in fun.I am in fun1.小结以上大概就是static常见的几种用法,如有错误之处还请指出。

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/cjia/6224.html

用C语言编程,做出的给分

深入理解 static 关键字

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部