如何理解C语言中的extern关键字?通俗解释

2021年3月23日15:22:47 发表评论 1,035 次浏览

我相信这篇文章和C初学者(如初学者)一样有趣, 并且对C初学者也很有帮助。因此, 让我从说起外部关键字适用于C变量(数据对象)和C函数。基本上, 外部关键字扩展了C变量和C函数的可见性。这可能就是它被命名的原因外部.

尽管大多数人可能理解变量或函数的"声明"和"定义"之间的区别, 但是为了完整起见, 我想对其进行澄清。

  • 宣言变量或函数的名称只是声明该变量或函数存在于程序中的某个位置, 但是没有为它们分配内存。变量或函数的声明起着重要的作用-告诉程序其类型将是什么。的情况下函数声明, 它还告诉程序参数, 其数据类型, 这些参数的顺序以及函数的返回类型。这就是声明。
  • 来到定义, 什么时候我们定义变量或函数, 除了声明所做的一切外, 还为该变量或函数分配内存。因此, 我们可以将定义视为声明的超集(或声明作为定义的子集)。

变量或函数可以是宣告任何次数, 但可以定义的只有一次。 (请记住基本原则, 即你不能同时拥有两个变量或函数的位置)。

现在回到外部关键词。首先, 让我们考虑一下外部在功能上。事实证明, 在声明或定义函数时, 外部隐式假定为关键字。当我们写的时候。

int foo(int arg1, char arg2);

编译器将其视为:

extern int foo(int arg1, char arg2);

自从外部关键字将功能的可见性扩展到整个程序, 只要该文件包含该功能的声明, 该功能就可以在整个程序的任何文件中的任何位置使用(调用)。 (在函数声明到位后, 编译器知道该函数的定义存在于其他地方, 并且可以继续编译该文件)。这就是全部外部和功能。

现在考虑使用外部与变量。首先, 你会如何宣布没有变量定义它?你将执行以下操作:

extern int var;

在这里, 一个整数类型变量称为变种已声明(尚未定义, 因此没有为变种至今)。我们可以根据需要进行多次声明。到现在为止还挺好。 🙂

现在, 你会如何定义 变种?你可以这样做:

int var;

在这一行中, 一个整数类型变量称为变种已经被宣布和定义(请记住定义是...的超集宣言)。由于这是一个定义, 用于变种也被分配。现在来了惊喜。当我们声明/定义一个函数时, 我们看到外部关键字隐式存在。但是变量不是这种情况。如果是这样, 将永远不会为他们分配内存。因此, 我们需要包括外部当我们要声明变量而不定义它们时, 显式地使用关键字。另外, 作为外部关键字通过使用外部带有变量的关键字, 我们可以在程序中的任何位置使用该变量, 前提是我们要包含该变量的声明, 该变量是在某个位置定义的。

现在让我们尝试了解外部有例子。

范例1:

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

该程序编译成功。变种是全局定义(并隐式声明)的。

范例2:

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

该程序编译成功。这里变种仅声明。注意var从未使用过, 因此不会出现问题。

范例3:

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

该程序在编译时引发错误, 因为变种被声明但未在任何地方定义。本质上, 该变量没有分配任何内存。该程序正在尝试将根本不存在的变量的值更改为10。

范例4:

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

假设somefile.h包含以下内容的定义变种, 该程序将成功编译。

范例5:

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

你认为该程序有效吗?好吧, 这是C标准带来的另一个惊喜。他们说..如果仅声明一个变量, 并且该声明还提供了一个初始化程序, 则将分配该变量的内存, 换句话说, 该变量将被视为已定义。因此, 根据C标准, 该程序将成功编译并运行。

因此, 这是对外部C中的关键字。

简而言之, 我们可以说:

  1. 声明可以进行多次, 但定义只能进行一次。
  2. 的外部关键字用于扩展变量/函数的可见性。
  3. 由于默认情况下函数在整个程序中都是可见的, 因此使用外部函数声明或定义中不需要。它的使用是隐式的。
  4. 什么时候外部与变量一起使用, 仅声明而未定义。
  5. 作为例外, 当外部变量是通过初始化声明的, 它也被当作变量的定义。
木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: