C++关键字 · 2021年7月22日 0

extern

解释这个关键字作用之前首先要明确声明和定义的关系

声明:声明变量或函数存在于程序中,但是内存不分配给他们。

定义:为该变量或者函数提供具体实现和内存,可以理解为定义是声明的超集,声明是定义的子集

关系:一个变量或函数可以被多次声明,但只能被定义一次。

通俗解释:

学校里有两个场地为:教室和操场

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 关键字将函数的可见性扩展到整个程序,因此可以在整个程序的任何文件中的任何位置调用该函数,前提是这些文件或位置包含该函数的声明。有了函数的声明,编译器就知道函数的定义存在于其他地方,它会继续编译文件。

总结:

  1. 声明可以进行多次,但定义只能进行一次。
  2. extern 关键字用于扩展变量/函数的可见性。
  3. 由于默认情况下函数在整个程序中都是可见的,因此在函数声明或定义中不需要使用 extern,它的使用是隐含的。
  4. 当 extern 与变量一起使用时,它只是声明的,而不是定义的。 extern int show;
     int main()
     {
         show = 1;
         return 0;
     }
     //非法,仅声明而未定义
  5. 作为一个例外,当使用初始化声明 extern 变量时,它也被视为变量的定义。 extern int show = 0;
     int main()
     {
         show = 1;
         return 0;
     }
     //合法声明的同时定义