📜  了解C语言中的“ extern”关键字

📅  最后修改于: 2021-05-25 19:15:09             🧑  作者: Mango

我相信这篇文章对于C处女(即初学者)将像对C精通者一样有趣且有用。因此,让我首先说extern关键字适用于C变量(数据对象) )和C函数。基本上,extern关键字扩展了C变量和C函数的可见性。这可能就是它被命名为extern的原因。
尽管大多数人可能理解变量或函数的“声明”和“定义”之间的区别,但是为了完整起见,我还是要澄清它们。

  • 一个变量或函数的声明只是声明的变量或函数存在于程序的地方,但是内存不分配给他们。变量或函数的声明起着重要的作用-告诉程序其类型将是什么。在函数声明的情况下,它也告诉程序的参数,它们的数据类型,这些参数的顺序,以及函数的返回类型。这就是声明的全部内容。
  • 关于定义,当我们定义一个变量或函数,除了声明所做的一切外,它还为该变量或函数分配内存。因此,我们可以将定义视为声明的超集(或声明作为定义的子集)。

变量或函数可以声明多次,但只能定义一次。 (请记住基本原则,即您不能在同一个变量或函数的两个位置中使用)。
现在回到extern关键字。首先,让我们考虑在函数中使用extern。事实证明,在声明或定义函数时,将隐式假定使用extern关键字。当我们写的时候。

int foo(int arg1, char arg2);

编译器将其视为:

extern int foo(int arg1, char arg2);

由于extern关键字将功能的可见性扩展到整个程序,因此可以在整个程序的任何文件中的任何位置使用(调用)该函数,只要这些文件包含该函数的声明即可。 (在函数声明到位后,编译器知道函数的定义存在于其他地方,并且可以继续编译文件)。这就是关于extern和function的所有内容。
现在让我们考虑将extern与变量一起使用。首先,如何在不定义变量的情况下声明变量?您将执行以下操作:

extern int var;

在这里,已经声明了一个称为var的整数类型变量(尚未定义,因此到目前为止尚未为var分配内存)。我们可以根据需要多次执行此声明。到现在为止还挺好。 🙂
现在,您如何定义var?您可以这样做:

int var;

在这一行中,已经声明定义了一个名为var的整数类型变量(请记住,定义声明的超集)。由于这是一个定义,因此还分配了var的内存。现在来了惊喜。当我们声明/定义一个函数,我们看到extern关键字是隐式存在的。但这不是变量的情况。如果是这样,将永远不会为他们分配内存。因此,当我们要声明变量而不定义它们时,需要显式包括extern关键字。另外,随着extern关键字将可见性扩展到整个程序,通过将extern关键字与变量一起使用,我们可以在程序中的任何位置使用该变量,只要我们将其声明包括在变量的某个位置即可。
现在,让我们尝试通过示例来了解extern。
范例1:

c
int var;
int main(void)
{
   var = 10;
   return 0;
}


c
extern int var;
int main(void)
{
  return 0;
}


c
extern int var;
int main(void)
{
  var = 10;
  return 0;
}


c
#include "somefile.h"
extern int var;
int main(void)
{
 var = 10;
 return 0;
}


c
extern int var = 0;
int main(void)
{
 var = 10;
 return 0;
}


该程序编译成功。 var是全局定义(并隐式声明)的。
范例2:

C

extern int var;
int main(void)
{
  return 0;
}

该程序编译成功。此处仅声明var。注意var从未使用过,因此不会出现问题。
范例3:

C

extern int var;
int main(void)
{
  var = 10;
  return 0;
}

该程序在编译时引发错误(在链接阶段,更多信息在这里),因为var是在任何地方声明但未定义的。本质上,var没有分配任何内存。并且程序正在尝试将根本不存在的变量的值更改为10。
范例4:

C

#include "somefile.h"
extern int var;
int main(void)
{
 var = 10;
 return 0;
}

假设somefile.h包含var的定义,则该程序将成功编译。
范例5:

C

extern int var = 0;
int main(void)
{
 var = 10;
 return 0;
}

您认为该程序可以工作吗?好吧,这是C标准带来的另一个惊喜。他们说..如果仅声明一个变量,并且该声明还提供了一个初始化程序,则将分配该变量的内存,换句话说,该变量将被视为已定义。因此,按照C标准,该程序将成功编译并运行。
因此,这是对C语言中的extern关键字的初步了解。
简而言之,我们可以说:

  1. 声明可以进行多次,但定义只能进行一次。
  2. extern关键字用于扩展变量/函数的可见性。
  3. 由于默认情况下函数在整个程序中都是可见的,因此不需要在函数声明或定义中使用extern。它的使用是隐式的。
  4. 当extern与变量一起使用时,仅声明而不定义。
  5. 作为例外,当使用初始化声明extern变量时,也将其作为变量的定义。
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。