extern关键字的作用

Posted Shemesz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了extern关键字的作用相关的知识,希望对你有一定的参考价值。

extern关键字


首先我们了解一下extern的工作原理:
简单来说就是,现在当前文件中找有没有全局变量,没有找到,才会去其他文件中查找

这个关键字真的比较绕,每次出现,每次容易绕混,到底是声明还是定义

  • 在定义变量的时候,这个extern居然可以被省略(定义时,默认均省略);
  • 在声明变量的时候,这个extern必须添加在变量前,所以有时会让你搞不清楚到底是声明还是定义。
  • 或者说,变量前有extern不一定就是声明,而变量前无extern就只能是定义。注:定义要为变量分配内存空间;而声明不需要为变量分配内存空间。

下面分变量和函数两类来说:

(1)变量

尤其是对于变量来说:

extern int a; // 声明一个全局变量 a

int a; // 定义一个全局变量 a

extern int a =0 ; // 定义一个全局变量 a 并给初值。

int a =0;    // 定义一个全局变量 a, 并给初值,

第四个等于第三个,都是定义一个可以被外部使用的全局变量,并给初值。

糊涂了吧,他们看上去可真像。但是定义只能出现在一处。也就是说,不管是int a;还是extern int a=0;还是int a=0;都只能出现一次,而那个extern int a可以出现很多次。

注意:
当你要引用一个全局变量的时候,你就必须要声明,extern int a; 这时候extern不能省略,因为省略了,就变成int a;这是一个定义,不是声明。注:extern int a; 中类型 int 可省略,即 extern a; 但其他类型则不能省略。

(2)函数

对于函数也一样,也是定义和声明,定义的时候用extern,说明这个函数是可以被外部引用的,声明的时候用extern说明这是一个声明。

 但由于函数的定义和声明是有区别的,定义函数要有函数体,声明函数没有函数体(还有以分号结尾),所以函数定义和声明时都可以将extern省略掉,反正其他文件也是知道这个函数是在其他地方定义的,所以不加extern也行。

例如 : 我想在B文件中调用A文件的函数

  • (1)通过头文件的方式(最有推荐)
    在这里插入图片描述
  • (2)不通过头文件
    a.c中定义一个fun函数,b.c中要引用这个函数,b.c中的声明extern int fun(); 与int fun();没有任何区别
    在这里插入图片描述
    在这里插入图片描述
    在函数引用上这俩个这没啥区别

以上是关于extern关键字的作用的主要内容,如果未能解决你的问题,请参考以下文章

16-static和extern关键字2-对变量的作用

iOS 中 const static extern 关键字总结

extern关键字的作用

C++编译过的C代码为什么要用extern C

C extern 关键词分析

extern关键词的作用