C语言Static 关键字解析

 更新时间:2022年02月17日 17:27:19   作者:Firefly  
这篇文章主要介绍了C语言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.

这里注意两点:

  • 局部静态量的作用于仍然有改变,仍然在数内部有效
  • 局部静态变量存储位置变为了内存,不再存储在栈里

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

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

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

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

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

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

定义静态函数的好处:

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

02static关键字作用

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

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关键字的好处,对于函数封装有好处,当你需要将一个功能函数封装起来,达到直接拷贝走这个函数就能用的程度,这个时候需要一个全部变量,这个时候在函数里面定义一个静态局部变量。

到此这篇关于C语言Static 关键字解析的文章就介绍到这了,更多相关Static 关键字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于C++复制构造函数的实现讲解

    关于C++复制构造函数的实现讲解

    今天小编就为大家分享一篇关于关于C++复制构造函数的实现讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++设计模式编程中的迭代器模式应用解析

    C++设计模式编程中的迭代器模式应用解析

    这篇文章主要介绍了C++设计模式编程中的迭代器模式应用解析,迭代器模式注重对集合中元素的遍历而不使其暴露,需要的朋友可以参考下
    2016-03-03
  • C++小知识:用合适的工具来分析你的代码

    C++小知识:用合适的工具来分析你的代码

    今天小编就为大家分享一篇关于C++小知识:用合适的工具来分析你的代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • C语言数据结构之栈与队列的相互实现

    C语言数据结构之栈与队列的相互实现

    这篇文章主要为大家详细介绍了如何利用C语言相互实现数据结构中的栈与队列,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-07-07
  • 基于Matlab实现BP神经网络交通标志识别

    基于Matlab实现BP神经网络交通标志识别

    道路交通标志用以禁止、警告、指示和限制道路使用者有秩序地使用道路, 保障出行安全.若能自动识别道路交通标志, 则将极大减少道路交通事故的发生。本文将介绍基于Matlab实现BP神经网络交通标志识别,感兴趣的可以学习一下
    2022-01-01
  • Cocos2d-x学习笔记之CCScene、CCLayer、CCSprite的默认坐标和默认锚点实验

    Cocos2d-x学习笔记之CCScene、CCLayer、CCSprite的默认坐标和默认锚点实验

    这篇文章主要介绍了Cocos2d-x学习笔记之CCScene、CCLayer、CCSprite的默认坐标和默认锚点实验,这是一个非常值得研究的问题,需要的朋友可以参考下
    2014-09-09
  • C++ 详细讲解stack与queue的模拟实现

    C++ 详细讲解stack与queue的模拟实现

    C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,也就是说实现了一个先进后出(FILO)的数据结构,许多程序都使用了 queue 容器。queue 容器可以用来表示超市的结账队列或服务器上等待执行的数据库事务队列
    2022-04-04
  • C++学校运动会管理系统的实现

    C++学校运动会管理系统的实现

    这篇文章主要为大家详细介绍了C++如何实现学校运动会管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • C语言 strftime 格式化显示日期时间的实现

    C语言 strftime 格式化显示日期时间的实现

    下面小编就为大家带来一篇C语言 strftime 格式化显示日期时间的实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C++实现各种排序算法类汇总

    C++实现各种排序算法类汇总

    这篇文章主要介绍了C++实现各种排序算法类,需要的朋友可以参考下
    2014-07-07

最新评论