auto、register、extern修饰符

来源:互联网 发布:多啦衣梦新式网络传销 编辑:程序博客网 时间:2024/06/06 00:39

auto、register、extern修饰符

1.auto(大将军)
只能修饰局部变量,可以省略,局部变量若无其它的修饰,则默认为 auto。放在内存上它修
饰的变量的特点是,随用随开,用完即消。
结论:忘记。

2.register(小太监)
只能修饰局部变量,原则上,将内存中的变量升级到 CPU 寄存器中存储,这样访
问速度会更快。但由于 CPU 寄存器数量相当有限,通常会在程序优化阶段,被优化为
普通的 auto 类型变量。可以通过汇编代码来查看,优化过程。
结论:忘记。

3.extern(通关文牒)
只能用来修饰全局变量,全局变量本身是全局可用的,但是由于文件是单个完成编
译,并且编译是自上而下的,所以说,对于不是在本范围内定义的全局变量,要想使用
必须用 extern 进行声明,如果不加上 extern, 就会造成重定义。
注意,经 extern 声明的变量,不可以再初始化


extern的应用

#include "stdafx.h"//编译器,的编译顺序,是从上向上//同文件:extern int a; //声明中不要出现初始化,定义只能有一次,而声明可以用多次。  //因为extern某些情况可以省略,所以int a;可能是声明,也可能是定义//而例如int a = 5; 只可能是定义//跨文件://extern int a; 先告诉编译器,后面用到了变量a,链接的时候,去相关文件中去查找。//单文件进行编译,然后链接int _tmain(int argc, _TCHAR* argv[]){printf("a=%d\n", a);return 0;}int a = 100; //在下面定义的全局变量

跨文件使用extern的流程

编译器先将 main.c 和 other.c 分别编译为 main.o 和 other.o。如果 main.c 中没有
extern int a;但是由于后面又使用了变量 a,则会报错。如果 main.c 中有 extern int a;则编
译通过,如果在链接中,其它文件中有定义,则顺利链接通过,否则的话,则会链接失
败。
全局变量,本质作用域内通用,即所有的 c 文件中均可使用,但是由于,单文件编
译,则需要声明。extern 有省略用法,不讲,也不推荐