了解C中的“extern”关键字-IDC帮帮忙

我确信这篇文章对于C virgins(即初学者)来说将是非常有趣和有用的,因为对于那些精通C语言的人来说也是如此。所以让我首先说extern关键字适用于C变量(数据对象)和C函数。 基本上,extern关键字扩展了C变量和C函数的可见性。可能这就是它被命名为extern的原因。

虽然(几乎)每个人都知道变量/函数的声明和定义的含义,但为了本文的完整性,我想澄清一下。变量/函数的声明只是声明变量/函数存在于程序中的某处但是没有为它们分配内存。但变量/函数的声明起着重要作用。这就是变量/函数的类型。因此,当声明变量时,程序知道该变量的数据类型。在函数声明的情况下,程序知道该函数的参数是什么,它们的数据类型,参数的顺序和函数的返回类型。这就是宣言。来到定义,当我们定义变量/函数时,除了声明的作用,它还为该变量/函数分配内存。因此,我们可以将定义视为一套超级的声明。(或声明作为定义的子集)。从这个解释中可以明显看出,变量/函数可以被声明任意次,但只能定义一次。(请记住,您不能拥有相同变量/功能的两个位置的基本原则)。这就是声明和定义。

现在回到我们的主要目标:理解C中的“extern”关键字。我已经解释了声明/定义的作用,因为必须理解它们才能理解“extern”关键字。让我们先来看看这个简单的案例。使用带有C函数的extern。默认情况下,C函数的声明和定义前缀为“extern”。这意味着即使我们不使用extern与C函数的声明/定义,它也存在于那里。例如,我们写的时候。

    int foo(int arg1,char arg2);

在开头有一个extern存在,它是隐藏的,编译器将其视为如下所示。

    extern int foo(int arg1,char arg2);

C函数定义的情况也是如此(C函数的定义意味着编写函数体)。因此,每当我们定义一个C函数时,在函数定义的开头就会出现一个extern。由于声明可以进行任意次,定义只能进行一次,我们可以注意到函数声明可以多次添加到多个C / H文件或单个C / H文件中。但是我们只注意到函数的实际定义一次(即仅在一个文件中)。并且当extern将可见性扩展到整个程序时,只要知道函数的声明,就可以在整个程序的任何文件中的任何地方使用(调用)函数。(通过了解函数的声明,C编译器知道函数的定义存在,并且它继续编译程序)。这就是关于C函数的extern。

现在让我们来看看第二个也是最后一个案例,即使用带有C变量的extern。我认为它比以前的情况更有趣和信息,其中extern默认存在于C函数。那么让我问一个问题,如何在不定义C变量的情况下声明它?你们中的许多人会认为这是微不足道的,但是用C变量理解extern是一个重要的问题。答案如下。

    extern int var;

这里,声明了一个名为var的整数类型变量(记住没有定义,即到目前为止没有var的内存分配)。我们可以根据需要多次进行此声明。(记住声明可以做任何次数)到目前为止一直很好。

现在你将如何定义一变量。现在我同意这是编程中最微不足道的问题,答案如下。

    int var;

这里,一个名为var的整数类型变量已被声明和定义。(记住,定义是超级声明集)。这里也分配了var的内存。现在出现了惊喜,当我们声明/定义了一个C函数时,我们看到默认情况下存在一个extern。在定义函数时,我们可以在extern之前添加它而不会出现任何问题。但是C变量并非如此。如果我们将extern的存在放在变量中作为默认值,那么它们的内存将不会被分配,它们将仅被声明。因此,当我们想要声明它们而不定义它们时,我们为C变量明确地设置了extern。此外,由于extern将可见性扩展到整个程序,

现在让我们尝试通过示例来了解extern。

例1:

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

分析:该程序编译成功。这里var是全局定义的(并且是隐式声明的)。

例2:

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

分析:该程序编译成功。这里只声明var。注意var从未使用过,所以没有问题。

例3:

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

分析:此程序在编译时抛出错误。因为var已声明但未在任何地方定义。从本质上讲,var没有分配任何内存。并且该程序试图将值更改为根本不存在的变量的10。

例4:

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

分析:假设somefile.h具有var的定义。该程序将成功编译。

例5:

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

分析:猜猜这个程序会起作用吗?好吧,这是C标准的另一个惊喜。他们说..如果一个变量只被声明并且初始化器也提供了该声明,那么将分配该变量的内存,即该变量将被视为已定义。因此,按照C标准,该程序将成功编译并运行。

这是对C中“extern”关键字的初步看法。

我确信你想要阅读这篇文章。我不会让你失望的。
简而言之,我们可以说

1.声明可以进行多次,但只能定义一次。
2.“extern”关键字用于扩展变量/函数()的可见性。
3.由于默认情况下函数在整个程序中可见。函数声明/定义中不需要使用extern。它的使用是多余的。
4.当extern与变量一起使用时,它只声明未定义。
5.作为例外,当使用初始化声明extern变量时,它也被视为变量的定义。