聊聊简单的 Static 关键字

开发 前端
C语言中staic关键字很简单,简单到你的任何一个项目中可以不写一个staic关键字也是没有问题的。写这篇章主要是一下自己的staic的理解和应用,当然在章开头依旧要照本宣科简述一下static关键字。

C语言中staic关键字很简单,简单到你的任何一个项目中可以不写一个staic关键字也是没有问题的。写这篇章主要是一下自己的staic的理解和应用,当然在章开头依旧要照本宣科简述一下static关键字。

01简述

static关键字在嵌入式C语言当中很简单,它有三个作用:

作用一:在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

void test1(void)
{
unsigned char a;
static unsigned char b;

a++
b++
}


在这个例子中,变量a是局部变量,变量b为局部静态变量。作用一说明了局部静态变量b的特性:在函数体,一个被声明为静态的变量(也就是局部静态变量)在这一函数被调用过程中维持其值不变。这个时候作用和全局变量是同的。

下面简单的例子,声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时候就可以进行计数。这个统计的方法是很好的,因为其他函数能修改这个变量(程序跑飞除外)。

void count();
int main()
{
int i;
for (i = 1; i <= 3; i++)
{
count();
{
return 0;
}
void count()
{
static num = 0;
num++;
printf(" I have been called %d",num,"times/n");
}


输出结果为:

I have been called 1 times.
I have been called 2 times.
I have been called 3 times.


这里注意两点:

局部静态量的作用于仍然有改变,仍然在数内部有效

局部静态变量存储位置变为了内存,不再存储在栈里

关于局部静态变量存储的问题,不太懂的同学移步之前文章《C语言在STM32中的内存分配》。

作用二:在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

这样定义的变量也称为全局静态变量:在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。也就是上述作用二中提到的在模块内(但在函数体外)声明的静态变量。

定义全局静态变量的好处:

  • 它的作用域只在这个文件中,不会被其他文件所访问,修改,是一个本地的局部变量。
  • 其他文件中可以使用相同名字的变量,不会发生冲突。

作用三:在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

这样定义的函数也成为静态函数:在函数的返回类型前加上关键字static,函数就被定义成为静态函数。

定义静态函数的好处:

  • 其他文件中可以定义相同名字的函数,不会发生冲突
  • 静态函数不能被其他文件所用。它定义一个本地的函数。

02多聊一些

对于上面讲到的,static关键字很简单,基本就是为了代码模块化。在相当一段时间内,我在工作中基本没有用到static关键字,在单片机的代码中,一般情况下一个人可以管理整个代码工程,所以并没有大量使用static关键字。的,static关键字很简单,基本就是为了代码模块化。在相当一段时间内,我在工作中基本没有用到static关键字,在单片机的代码中,一般情况下一个人可以管理整个代码工程,所以并没有大量使用static关键字。

在之前的文章《STM32“隐藏的定时器”-DWT》测量代码运行时间的代码如下:

float DTW_Time_Difference_ms(void)
{
static uint32_t old_counter;
uint32_t counter,couter_current;
couter_current = DWT_TS_GET();
if(couter_current > old_counter)
counter = couter_current - old_counter;
else
counter = couter_current + 0XFFFFFFFF - old_counter;
old_counter = couter_current;
return (counter / (SystemCoreClock/1000));
}


用到了static关键字,我也体会到了使用static关键字的好处,对于函数封装有好处,当你需要将一个功能函数封装起来,达到直接拷贝走这个函数就能用的程度,这个时候需要一个全部变量,这个时候在函数里面定义一个静态局部变量。

本文转载自微信公众号「知晓编程」,可以通过以下二维码关注。转载本文请联系知晓编程公众号。

责任编辑:武晓燕 来源: 知晓编程
相关推荐

2021-02-01 13:10:07

Staticc语言UNIX系统

2020-12-09 05:19:35

static关键字Java

2011-07-14 23:14:42

C++static

2010-02-02 14:27:54

C++ static关

2023-03-09 07:38:58

static关键字状态

2024-04-08 11:35:34

C++static关键字

2009-06-25 10:33:53

StaticJava类

2015-11-10 16:10:22

C语言StaticConst

2009-09-07 18:53:46

static关键字

2011-04-21 16:57:56

staticextern

2009-10-15 15:43:25

VB.NET Pati

2024-02-26 10:36:59

C++开发关键字

2022-05-06 08:32:40

Pythonwith代码

2023-11-28 21:50:39

finalstaticvolatile

2024-03-15 15:12:27

关键字底层代码

2022-11-12 18:32:50

Golangomitemptyjson

2022-01-04 16:35:42

C++Protected关键字

2009-09-02 09:24:03

C# this关键字

2012-03-01 12:50:03

Java

2009-09-17 09:30:00

Linq LET关键字
点赞
收藏

51CTO技术栈公众号