设为首页 加入收藏

TOP

c语言static关键字的理解
2019-01-22 22:08:29 】 浏览:138
Tags:语言 static 关键字 理解

static

一、概述

在c语言中static恰当的使用能让程序更加完美,细节上的严谨,代码会更好,也更利于程序的维护与扩展。

而static使用灵活,且又有两种完全无关的用法,所以整理总结一下。

二、static的两种用法:

1、static修饰局部变量,成为一个局部静态变量。

2、static修饰全局变量与函数,成为静态全局变量与静态函数。

 

三、相关涉及概念

  可能会疑惑,修饰全局变量与修饰函数怎么会是一个用法?

  static涉及的东西也比较多,以下有几个概念需要明白。

 

 1、什么是存储类

  简单的说也就是存储类型,c中变量是在哪里存放的?内存是怎么管理的?

  所以内存的管理:

①栈:局部变量,函数调用传参的过程

②堆:动态存储区,需要程序员去申请释放

③数据段(data段):显式初始化非零的全局变量(static修饰显式初始化非0的局部变

)

④bss段:显式初始化为0与未初始化的全局变量(static修饰显式初始化为0与未初始化的局部变量)

⑤text段:代码(函数)、只读数据

 

2、什么是生命周期

描述变量什么时候诞生,什么时候消亡,从诞生到消亡就是这个变量的生命周期。

①局部变量(栈),生命周期即是进入函数,从变量创建到函数返回时变量死亡。

②全局变量(data/bss),生命周期是程序执行到程序结束

③堆变量,生命周期是从我们malloc到free

 

3、什么是作用域

描述变量的作用的代码范围。c的作用域规则是代码块作用域,即是一对花括号{}。

一般的从变量定义到{}结束,即是这个变量的作用域

全局变量与函数一般是文件作用域,即作用域是整个.c

 

4、什么是链接属性

编译器将很多源文件编译成很多.o文件后,每个.o文件里有符号、代码段、data/bss等等的分段,链接器需要通过符号将这些内存链接起来。而这些符号就是链接属性。

c中有三种链接属性:外链接、内链接、无链接属性

外链接:外部链接,可以在整个程序(跨文件)链接。

    普通的函数与全局变量。

内链接:内部连接,只能在当前.c文件进行链接。

    static修饰的全局变量与函数

无链接:没有链接。

      普通局部变量 

 

四、具体分析static的两种用法

1、static修饰局部变量(静态局部变量)与普通局部变量相比

①静态局部变量作用域与连接属性与普通局部变量一样

②存储类:静态局部变量分配在data/bss段,普通局部变量在栈上。

③生命周期:因为存储类的不同,静态局部变量的生命周期得到延长了,直到程序结束。

所以当局部静态变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能再对它进行访问,直到该函数再次被调用,并且值不变。

2、static修饰全局变量\函数 与 普通全局变量\普通函数相比

存储类、生命周期、作用域都一样

差别在于static修饰全局变量\函数连接属性是内连接,普通全局变量\普通函数是外链接

就是说static修饰全局变量\函数不能跨文件访问调用

 

五、补充:为什么需要这样?

原因是命名的冲突、一个大工程不是常常不是一个人完成的,难免会遇到全局变量、函数命名一样。为了减少这类冲突static是很有用的工具。但是很可惜并不能完全解决,所以我们应该有效的去避免减少此类情况的发生。

如果函数仅仅被同一个源文件调用时,我们就应该声明该函数为static。

  ......

 


 

 作者:Devil-wei

出处:https://www.cnblogs.com/Devil-wei/

版权声明:本文版权归作者,转载请标注文章作者与出处


编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C语言——<计算>_较大两个.. 下一篇如何使用cubemx 配置freertos,实..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(217) }