auto、register、extern修饰符
1.auto(大将军)
只能修饰局部变量,可以省略,局部变量若无其它的修饰,则默认为 auto。放在内存上它修
饰的变量的特点是,随用随开,用完即消。
结论:忘记。
2.register(小太监)
只能修饰局部变量,原则上,将内存中的变量升级到 CPU 寄存器中存储,这样访
问速度会更快。但由于 CPU 寄存器数量相当有限,通常会在程序优化阶段,被优化为
普通的 auto 类型变量。可以通过汇编代码来查看,优化过程。
结论:忘记。
3.extern(通关文牒)
只能用来修饰全局变量,全局变量本身是全局可用的,但是由于文件是单个完成编
译,并且编译是自上而下的,所以说,对于不是在本范围内定义的全局变量,要想使用
必须用 extern 进行声明,如果不加上 extern, 就会造成重定义。
注意,经 extern 声明的变量,不可以再初始化
extern的应用
extern 就相当于一个声明,声明了某个变量,但这个声明是全局性的,在整个工程文件中都可以去查找它的定义,使用的目的就是其他包含了.h文件的文件中可以调用相应的函数,通常这样使用:如在pvp_mgr.h中声明了这个类对象 extern pvp_mgr g_pvp_mgr; 然后在对应的pvp_mgr.cpp中定义 pvp_mgr g_pvp_mgr; 这样在其他包含pvp_mgr.h的文件中就可以使用g_pvp_mgr这个对象来调用这个类中的函数,如果没有声明成extern类型的则不是全局的,其他文件不可以调用,有关预编译头:一般在.cpp文件中都要添加stdafx头文件用于预编译头相关作用,而.h文件中则不需要添加此头文件,在.cpp中也可以使用预处理指令将预编译头屏蔽掉,就可以在编译的时候不去找预编译头这个文件,这时可以不加stdafx头文件
#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 有省略用法,不讲,也不推荐