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.用于修饰函数的声明与定义和修饰变量的含义一样,不加任何修饰符的函数声明与定义默认为externNote:
同一工程下,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"的使用