c语言中各个符号修饰符的生命周期
来源:互联网 发布:什么是软件的ppt 编辑:程序博客网 时间:2024/05/21 21:02
(1)auto
auto修饰符只能用在函数内的对象声明。声明中有auto修饰符的对象具有自动生存周期。
在ANSI C中,函数内的对象声明在默认情况下有自动生存周期,所以在函数内声明时auto可省略。
(2)register
当声明对象有自动生存周期时,可以使用register修饰符。因此,register也只能用在函数内的声明中。
此关键字告诉编译器:此对象的存取应该尽量快,最好存储在CPU的寄存器中。然而,编译器不见得会这么做。
另外要注意的是,当一个对象声明为register,就不可使用地址运算符&了,因为它有可能被放到寄存器中。
(3)static
函数标识符如果被声明为static,就具有静态生命周期。
如果是定义在函数外,那么该对象具有内部链接,其它程序文件不能对其访问。
如果是定义在函数内,那么该对象具有无链接,函数外不能对其访问。
注意:static变量初始化时,只能用常量。
(4)extern
如果声明在函数外,那么该对象具有外部链接,能够在其它程序文件使用。但要注意它有可能会被函数内定义的重名的变量所隐藏起来。
如果声明在函数内,该对象具有何种链接取决于当前程序文件中定义在函数外的相同名字的对象。如果在函数外也定义了一下相同名字的static对象,则该函数内的对象具有无链接,否则具有外部链接。
extern的对象都具有静态生命周期。
使用extern时,注意不能重复定义,否则编译报错,如:
程序文件一:
extern int a = 10; //编译警告,extern的变量最好不要初始化
程序文件二:
extern int a = 20; //重复定义,应改为extern int a;
一般最好这样,如果需要初始化,可把extern修饰符去掉(但也不要重复定义),另外如果其它程序文件也需要用到该变量,可用extern来声明该变量。这样会比较清晰。
(5)缺省修饰符
函数内,与auto相同;
函数外,与extern相同;
linkage
lifetime
auto
函数内
no linkage
自动
函数外
语法错
语法错
register
函数内
no linkage
自动
函数外
语法错
语法错
缺省
函数内
no linkage
自动
函数外
external linkage
静态
static
函数内
no linkage
静态
函数外
internal linkage
静态
extern
函数内
与它在函数外所声明的一致
静态
函数外
external linkage
静态
链接符:
(1)外部链接
表示在整个程序中(多个程序文件)是相同的函数或对象。常见的有,在函数体外声明的extern变量。
(2)内部链接
表示只在当前程序文件中是相同的函数或对象。其它程序文件不能对其进行访问。常见的有,在函数体外声明的static变量。
(3)无链接
一般声明在函数内部的auto、register变量、还有函数的参数,都是无链接。它的作用域是函数内部。
生存周期:
(1)静态生存周期
具有静态生存周期的所有对象,都是在程序开始执行之前就被事先创建和初始化。它们的寿命覆盖整个程序的执行过程。如在函数内定义了一个static变量,那第一次调用该函数后,该变量的值将会被保留,当第二次被调用时,该变量的值还是第一次调用结束时的值。
(2)自动生存周期
自动生存周期的对象的寿命由“对象定义所处在的大括号{}”决定。每次程序执行流进入一个语句块,此语句块自动生存周期的对象就会被创建一个新实例,同时被初始化。
总结:
还有很多的扩展有待于进一步加上去
扩展总结1:修改变量的存储类型并不表示修改变量的作用域,它仍然只能在该代码块内按名字访问。
是不是看到这句话人就晕了,是啊,我也晕了。
举个例子,大家和我都不晕了
在一个函数内,给一个变量好比int a 前边加上关键字static,可以使它的存储类型从auto变成static,具有静态存储类型的a在函数执行完毕后还一直存在,但是这个
变量a还是只能在这个函数内部访问,外部的函数还是不能访问这个a
扩展总结2:函数的形式参数不能声明为static,因为实参总是在堆栈中传递给函数,用于支持递归。在栈中的数据,用完后,栈就pop出。
- c语言中各个符号修饰符的生命周期
- C语言中extern修饰符的用法
- C语言中extern修饰符的用法
- C语言中extern修饰符的用法
- C语言中extern修饰符的用法
- C语言 用const修饰符定义只读常量,只读常量与#define定义的符号常量的区别
- C语言中符号常量的用法
- C语言中符号的优先级-摘录
- c语言中 符号的优先级
- C语言修饰符
- C语言的几个修饰符
- C语言数据类型的修饰符
- C语言语言中符号的优先级的口诀
- C语言const的修饰
- c语言中extern和static修饰的全局变量
- python中'@'符号用作函数修饰符
- C语言中个各个进制的表示方法
- 各个访问修饰符的权限细节
- 一年如梦(四)
- c++深拷贝与浅拷贝
- Android中点中overlay气泡对话提示框效果
- 你会如何驾驭移动互联网快鱼吃慢鱼的时代?
- Software Model - 软件架构模式和设计模式
- c语言中各个符号修饰符的生命周期
- smoj—1036 最长不降子序列
- Android学习系列(4)--App自适应draw9patch不失真背景
- oracle 学习网址
- OFBiz
- 真希望我不是从这本书开始学习C++的 《C++Primer Plus(第五版)中文版》书评
- 如何成为一名专家级的开发人员
- 解决办法Android中Error generating final archive: Debug certificate expired on
- android系统详细介绍 你对这个小机器人了解多少呢?