理解 C 中的“extern”关键字

102 阅读2分钟

尽管大多数人可能理解变量或函数的“声明”和“定义”之间的区别,但为了完整起见,我想澄清一下。 

  • 变量或函数的声明只是声明变量或函数存在于程序中的某个位置,但没有为它们分配内存。变量或函数的声明起着重要作用——它告诉程序它的类型将是什么。在函数声明的情况下,它还告诉程序参数、它们的数据类型、这些参数的顺序以及函数的返回类型。这就是声明的全部内容。
  • 回到定义,当我们定义一个变量或函数时,除了声明所做的一切之外,它还为该变量或函数分配内存。因此,我们可以将定义视为声明的超集(或将声明视为定义的子集)。
  • Extern 是外部的简称。
  • 当特定文件需要访问另一个文件中的变量时使用。

  • 当我们写 extern some_data_type some_variable_name; 没有分配内存。仅声明变量的属性。
  • 文件中允许多次声明外部变量。这不是自动变量的情况。
  • 外部变量对编译器说“超出我的范围,你会发现我声明的变量的定义。”
  • 编译器相信外部变量所说的都是真的并且不会产生错误。当链接器发现不存在这样的变量时,它会抛出一个错误。
  • 当一个外部变量被初始化时,它的内存被分配并且它被认为是定义的。
  • 变量或函数可以声明任意次数,但只能定义一次。

现在回到 extern 关键字。首先,让我们考虑在函数中使用 extern。事实证明,在声明或定义函数时,隐式假定了 extern 关键字。当我们写。

int foo(int arg1,char arg2);

编译器将其视为:

extern int foo(int arg1, char arg2);

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