解释这个关键字作用之前首先要明确声明和定义的关系
声明:声明变量或函数存在于程序中,但是内存不分配给他们。
定义:为该变量或者函数提供具体实现和内存,可以理解为定义是声明的超集,声明是定义的子集。
关系:一个变量或函数可以被多次声明,但只能被定义一次。
通俗解释:
学校里有两个场地为:教室和操场
classroom.h playground.cpp
操场上的同学能听到教室里的声音:
//在playground.cpp中
#include"classroom.h"/
这时候你在教室里大吼一声:“我有个篮球”——这是声明
//在classroom.h中
extern int ball;
操场上的同学听到了于是打算借球
//在playground.cpp中
int main(){
ball=1;
return 0;
}
//报错
这时候他们发现借不到球,因为你只是大吼了你有球,但这个球的实物并不存在,所以程序报错了
所以你可以先在教室喊你有一个球(空头支票),但在借别人用你的球之前,你必须先造一个球:
//在playground.cpp中
int ball;
int main(){
ball=1;
return 0;
}
//成功
特性:
在声明或定义函数时,编译器会隐式地将其视为增加了extern关键字,例如当写下如下代码:
int compare(int a,int b);
编译器会将其视为:
extern int compare(int a,int b);
extern 关键字将函数的可见性扩展到整个程序,因此可以在整个程序的任何文件中的任何位置调用该函数,前提是这些文件或位置包含该函数的声明。有了函数的声明,编译器就知道函数的定义存在于其他地方,它会继续编译文件。
总结:
- 声明可以进行多次,但定义只能进行一次。
- extern 关键字用于扩展变量/函数的可见性。
- 由于默认情况下函数在整个程序中都是可见的,因此在函数声明或定义中不需要使用 extern,它的使用是隐含的。
- 当 extern 与变量一起使用时,它只是声明的,而不是定义的。 extern int show;
int main()
{
show = 1;
return 0;
}
//非法,仅声明而未定义 - 作为一个例外,当使用初始化声明 extern 变量时,它也被视为变量的定义。 extern int show = 0;
int main()
{
show = 1;
return 0;
}
//合法声明的同时定义