吾爱程序员:这里有好玩的游戏和软件
当前位置:首页C语言教程 → 理解 C 中的“extern”关键字

理解 C 中的“extern”关键字

来源:网络 | 更新时间:2022-01-08 14:32:24
我相信这篇文章对于 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 与变量一起使用。首先,如何在不定义变量的情况下声明变量?你会做这样的事情:
extern int var;
这里,声明了一个名为 var 的整数类型变量(它还没有定义,所以到目前为止还没有为 var 分配内存)。我们可以根据需要多次执行此声明。到现在为止还挺好。? 现在,您如何定义var?你会这样做:
int var;
在这一行中,一个名为 var 的整数类型变量已被声明定义(请记住,定义声明的超集)。因为这是一个定义,也分配了 var 的内存。现在惊喜来了。当我们声明/定义一个函数时,我们看到 extern 关键字隐式存在。但变量并非如此。如果是这样,则永远不会为它们分配内存。因此,当我们想要声明变量而不定义它们时,我们需要显式包含 extern 关键字。此外,由于 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. 作为一个例外,当一个外部变量通过初始化声明时,它也被当作变量的定义。
   

最新文章

热点资讯

手游排行榜

CopyRight 2020-2030吾爱程序员

鄂ICP备2021004581号-8

本站资源收集于网络,如有侵权请联系我们:35492删除0109@qq.com