extern关键字网上不少资料,但我一直想说说自己认知,并加深我对此关键字的认识度。
在很久很久以前没有C++这个东西,只有C,正如我刚开始编程的时候一样,当时我只会简单的C,代码编译的时候会把每个.C后缀文件都编译一遍,即使你从未用过这个文件,他还是要被编译,只要一个文件没通过编译就不行。
当时很不注意,每个文件中都有一些全局变量,当然的保证这些全局变量都只在整个工程中定义一次,且不能重名。
例如
A.c中有全局的
int a=10;
int Add(int a,int b)
{
return a+b;
}
他们的名字其实在初始化的事实就映射到全局固定的地址上,所以在其他任何.c文件中都不能再定义同样名字的全局普通成员,有人说那是不是函数和变量是分开的呢,可不可以定义一个变量叫
int Add=1;这样行吗,答案是否定,因为在C语言里所有全局普通的成员名字都必须不一样,法律是绝对的
那我能不能在别的文件访问A.c中的全局普通成员呢,当然可以,所以设计者弄出了extern;
假如你在某个.c中的某个作用域想访问A.c的全局普通成员(但是又不想include引用A.h,或者A.c),只要在作用域的开始用extern声明他们是来自别的C文件的全局普通成员就行了,因为所有C文件中的所有全局变量和函数都会自动初始化并分配地址,即使不include
如下
extern int a;
extern int Add(int a,int b);
之后就可以尽情使用了,不过后来随着时间发展,进入新世纪编译器便认同extern int Add(int a,int b);等效于int Add(int a,int b);(不过加上extern语义更明确了)
但是千万别认为编译器会认同extern int a;等效于int a;那是不可能的,因为int a;本身就带有定义的操作。而extern int a;是纯申明没定义。
但是后来C++出现了,类的出现,很少人还大面积使用全局变量,即使使用也是带有命名空间的使用方式,extern作为一个历史产物还是被保留至今,而且有extern “C”这个用法来兼容过去制作的C函数,方便导出。
最后总结:
extern 用途一:用来纯声明一个全局非静态变量
extern 用途二:用来引用并声明一个来自其他文件的全局非静态成员。
extern 用途三:后面加“C”,extern “C”用来导出C风格的函数供C++或其他语言调用