了解C语言中的extern关键字

    我相信这篇文章对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。首先,在不定义变量的情况下,如何声明变量?你应该会这样做:

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. 作为一个例外,当声明extern变量的同时初始化变量,就相当于为变量定义。
参考文档

[1]GeeksforGeeks.Understanding “extern” keyword in C[EB/OL].https://www.geeksforgeeks.org/understanding-extern-keyword-in-c,2020-11-16.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值