我知道C中的全局变量有时有extern关键字。什么是extern变量?申报是什么样的?它的范围是什么?

这与跨源文件共享变量有关,但这究竟是如何工作的呢?我在哪里使用extern?


当前回答

添加extern将变量定义转换为变量声明。关于声明和定义之间的区别,请参阅本线程。

其他回答

Extern告诉编译器信任你,这个变量的内存在其他地方声明了,所以它不会尝试分配/检查内存。

因此,您可以编译一个引用extern的文件,但是如果没有在某个地方声明该内存,则不能进行链接。

对于全局变量和库很有用,但是危险,因为链接器不进行类型检查。

                 declare | define   | initialize |
                ----------------------------------

extern int a;    yes          no           no
-------------
int a = 2019;    yes          yes          yes
-------------
int a;           yes          yes          no
-------------

声明不会分配内存(必须为分配内存而定义变量),但定义会。 这只是对extern关键字的另一种简单看法,因为其他答案真的很棒。

In C a variable inside a file say example.c is given local scope. The compiler expects that the variable would have its definition inside the same file example.c and when it does not find the same , it would throw an error.A function on the other hand has by default global scope . Thus you do not have to explicitly mention to the compiler "look dude...you might find the definition of this function here". For a function including the file which contains its declaration is enough.(The file which you actually call a header file). For example consider the following 2 files : example.c

#include<stdio.h>
extern int a;
main(){
       printf("The value of a is <%d>\n",a);
}

example1.c

int a = 5;

现在,当你一起编译这两个文件时,使用以下命令:

步骤1)cc -o ex example.c 步骤2)。/交货

输出结果如下:a的值<5>

添加extern将变量定义转换为变量声明。关于声明和定义之间的区别,请参阅本线程。

我喜欢把extern变量看作是你对编译器做出的承诺。

当遇到一个extern时,编译器只能找出它的类型,而不能找出它“居住”的位置,因此它不能解析引用。

你告诉它:“相信我。在链接时,这个引用将是可解析的。”