用extern可以声明全局变量,比如:
extern int a;
这句话的意思就是:大家注意了,小a童鞋是全局变量。
extern使用规则
1.extern声明可以在任意位置,任意文件中多次声明。
extern int a;
此时仅仅是声明,变量a没有内存空间,也没有赋值。
2.extern声明的全局变量必须初始化,而且只能初始化一次。
int a = 10;
此时才是变量a的定义,也就是初始化,即分配了内存,也有了初值。但只能定义一次。
示例
test01.h
extern int a; //声明全局变量
void func(void);//声明一个函数
test01.c
int a = 10; //初始化
void func(void)
{
a += 100;
printf("test01: a=%d\r\n",a);
}
main.c
int main(void)
{
extern int a;//全局声明,表示要引入的这个变量a是全局变量
a += 50;
printf("main: a=%d\r\n",a);//a=60,在main.c中修改a
func();//a=160,在test01.c中又修改了a
return 0;
}
简单的说:你在某个头文件中用extern对变量做全局声明,在对应的全局位置定义一次,你就可以在其他文件中使用它了。
那么,用extern声明全局变量,和我们常用的 int a 声明有何区别呢?
int a;
int a = 0;
这两句其实是一样的,int a;
其实是个定义性声明,它已经为a分配了内存空间,并且赋初值为0了。而extern int a;
纯粹是个声明,没有分配内存空间,也没有赋值。
使用环境的区别
一般我们写C++代码时,都会把变量封装到类里,很少会把变量直接暴露在全局环境下。使用变量的时候,都是通过类的实例来使用变量的,因此不存在直接使用全局变量的情况,也就很少用到extern关键字。当然不是绝对的,也要看具体情况。
而写C代码时,因为C没有类的概念,所以大多都是直接在头文件中定义变量,这时就需要考虑全局变量冲突的问题了,当多个文件互相包含时,如果使用int a;
很容易导致变量重复定义,因此就常用extern声明全局变量,因为它仅仅是声明,不会导致重复定义。
extern声明函数
函数的声明本身默认就是extern全局声明,只是省略了。
因为函数的声明和定义是明显区分开的,因此不存在重复定义问题,所以函数不需要考虑extern全局声明。
extern用在C/C++混合编译中
extern还有一个用途,在C/C++混合编译中,通常是在C++文件中要引用C的函数,需要告诉编译器这个函数使用C的编译规则。extern "C" void func( void );
或者
extern "C" {
void func1( void );
void func2( void );
}