C++中extern与static的用法

    C++中extern与static的用法很容易混淆,现总结如下:

1.用于修饰全局变量的定义
extern修饰全局变量的定义用于扩大全局变量的作用域,使其他文件也可使用该全局变量
static修饰全局变量的定义用于限定该全局变量只能在本文件内使用
我们知道每个.cpp文件编译后成为一个.obj文件
extern的作用就是使a.obj能使用b.obj中定义的全局变量
static则限定b.obj中定义的全局变量只能在b.obj中使用,不能被a.obj使用。
如:
extern int a = 100;   定义全局变量,并扩大该全局变量的作用域为整个工程。
static int a = 100;   定义全局变量,并限定全局变量的作用域为本模块。
对于非const变量,不加任何修饰符默认为extern
对于const变量,不加任何修饰符默认为static
extern const int a = 100;

Note:在extern修饰全局变量的定义时,并须写全定义式,如extern int a(0) 或 extern int a = 0。否则extern int a仅仅是修饰变量的声明。

2.extern用于修饰全局变量的声明
指出在该.cpp文件中,后续使用的该变量定义在外部文件中,这样使该.cpp文件能被编译通过,后续链接会在该工程的其他文件中查找该变量的定义。
extern int a;

3.用于修饰函数的声明与定义和修饰变量的含义一样,不加任何修饰符的函数声明与定义默认为extern

Note:
同一工程下,a.cpp中有extern int a = 5;
b.cpp中有extern int a = 10;
链接时会报错:"int a" already defined in ...
若a.cpp中有static int a = 5;
b.cpp中为static int a = 10;或extern int a = 10;
则没有错误。

4.extern "C"
C++语言在编译的时候为了解决同名函数的重载问题,会将函数名和参数联合起来生成一个中间的函数名称,而C则不会,C是不支持函数重载的。
extern "C"用于告诉编译器按照C的方式产生函数名,这样就能保证C的程式能调用C++语言写的Dll。
可以在cpp文件中通过以下方式简化extern "C"的使用
#ifdef __cplusplus  
extern "C" {  
#endif  

代码......
 
#ifdef __cplusplus  
}  
#endif
5.extern "C"与extern&static的混用
注意不要被extern "C"中的extern蒙蔽了双眼,不包含单独使用extern时的含义。
若在.cpp文件中,定义一函数,使编译器按照C的方式产生函数名称并且扩大函数的作用域为整个工程,则如下定义:
extern "C" extern int test()
{
	return 0;
}
对应的如下函数的定义就不难理解了
extern "C" static int test()
{
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值