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

1、简述

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,函数就被定义成为静态函数。

定义静态函数的好处:

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

2、多聊一些

对于上面讲到的,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;elsecounter = couter_current + 0XFFFFFFFF - old_counter;old_counter = couter_current;return (counter / (SystemCoreClock/1000));
}

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

各位读文章的大佬,如果有static关键字的妙用,欢迎在评论区留言!

点击查看本文所在的专辑:C语言进阶https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzIxNTg1NzQwMQ==&action=getalbum&album_id=1647333547814273027#wechat_redirect

C语言中static关键字详解相关推荐

  1. c语言关键字extern作用,C语言中extern关键字详解

    <C语言中extern关键字详解>由会员分享,可在线阅读,更多相关<C语言中extern关键字详解(5页珍藏版)>请在人人文库网上搜索. 1.C 语言中 extern 关键字详 ...

  2. C语言中static变量详解

    google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的初学者来说参考性不是很大.所以,我这篇博文博采众家之长,把互 ...

  3. C语言中static用法详解

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.static修饰变量 1.修饰局部变量 2.修饰全局变量 二.static修饰函数 总结 前言 static关键字 ...

  4. C语言中const关键字详解

    1.什么是const? 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的.(当然,我们可以偷梁换柱进行更新:) 2.为什么引入const? const 推出的初始目的 ...

  5. Java中的static关键字详解

    ** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...

  6. 【✊基础不牢,地动山摇のC语言中static关键字✊】

    C语言中static关键字 用static声明限定外部变量与函数,可以将其后声明的对象的作用域限定为被编译源文件的剩余部分.要降对象指定为静态存储,可以在正常的声明之前加上关键字static作为前缀. ...

  7. Day16-01 P71 面向对象12什么是多态 P72 对象13:instanceof和类型转换 P73 static关键字详解 P74 抽象类 P75 接口的定义与实现 P76N种内部类

    Day16-01 P71 面向对象12:什么是多态 //父类Person package com.oop.demo06;public class Person {public void run(){S ...

  8. java 函数fun_c语言中fun用法详解_后端开发

    Java Dao层的作用_后端开发 Dao层叫数据访问层,属于一种比较底层,比较基础的操作,可以具体到对于某个表或某个实体的增删改查,其Dao层的作用是对数据库的访问进行封装,从而不涉及业务,实现解耦 ...

  9. c语言中funx的作用,c语言中fun用法详解

    C语言中fun用法详解 fun函数是自定义的C/C++语言函数,函数功能多样.该函数名为"函数"英文function的简写,一般在示例和试题中使用,通常在主函数中被调用. C/C+ ...

最新文章

  1. Nginx+keepalived 实现高可用,防盗链及动静分离配置
  2. Android 7.0 出现 ”FileUriExposedException“ 和 ”解析包出现错误“ 异常的解决办法...
  3. 智力题:关于进入房间一次,判断哪个开关控制哪盏灯的问题
  4. 解决cvc-complex-type.2.4.a: Invalid content was found starting with element
  5. Intellij IDEA设置忽略部分类编译错误
  6. 各大主流K8S服务全方位能力比对
  7. 矩阵连乘问题(c++)
  8. 改了上百遍!记上海交通大学第一篇《Science》
  9. 晚安,2017。你好,2018。
  10. web developer tips (71): 关于FastCGI 1.5beta几个新配置设置
  11. 牛客小白月赛5求阶乘末尾有多少个0
  12. 检测报告上CNAS、CMA资质含义及联系
  13. Python模块之Pandas模块学习笔记
  14. 华胜天成收购中天安泰10%股权 出手网络信息安全
  15. 廖雪峰git教程阅读之一
  16. C语言基础入门48篇_30_二维数组的定义与使用(二维数组的定义:type 数组名[行][列]、二维数组的初始化、二维数组的引用)
  17. Qt之Windows下禁用中文输入法
  18. 基于大数据分析技术实现对信用卡盗刷的预防
  19. 注意力机制在推荐模型中的应用——AFM、DIN、DIEN
  20. Apache 2.4.7在CentOS6.4中安装配置反向代理解决单外网IP对应多个内网主机的方法实践

热门文章

  1. 谈谈Winform程序的界面设计
  2. python中的异或操作_Python中的异或和位操作的反转
  3. CentOS 7 上安装 MySQL5.7
  4. php 标签页切换,vue.js实现标签页切换效果
  5. 中移4G模块-ML302-OpenCpu开发-(固件编译和烧录)
  6. 计算机维修法宝,计算机的三大法宝
  7. mysql5.7.11源码安装,mysql 5.7.11 源码安装
  8. 网络图片 base64 java_java图片转base64和真实的结果不一样
  9. python使用repeat、cycle重复打印字符串
  10. python使用英汉大字典离线获取单词释义