auto、register、extern修饰符

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 有省略用法,不讲,也不推荐

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值