为什么C中的全局变量的存储类隐式定义为"extern"?

Rad*_*gia -5 c scope global-variables extern

例如,当我们声明任何全局变量时

int x;
Run Code Online (Sandbox Code Playgroud)

它相当于

extern int x; 
Run Code Online (Sandbox Code Playgroud)

现在默认情况下,编译器将全局变量初始化为0,这意味着它们被分配了内存.但如果我只是写

extern int x;
Run Code Online (Sandbox Code Playgroud)

那么这只会声明变量,而不会分配任何内存.所以,我的查询是,如果我之前写externint x或者我不写它,在全局变量的情况下,编译器如何区别对待它们?在我简单写入的情况下int x,它分配内存并同时将extern置于之前int x,而在我写入的情况下extern int x,它只声明变量而没有分配内存.请说明编译器如何以两种方式运行.

AnT*_*AnT 7

你的问题的前提是不正确的.这个

int x;
Run Code Online (Sandbox Code Playgroud)

是一个暂定的定义(将转换为x翻译单元末尾的正常定义).

这个

extern int x; 
Run Code Online (Sandbox Code Playgroud)

是一个非定义的声明,它根本不是一个定义.

它们甚至不等同.

与原始定义相当的松散等价物

extern int x = 0;
Run Code Online (Sandbox Code Playgroud)

这是一个定义.但这不是一个确切的等价物,因为这个定义不是暂定的.

extern如果(且仅当),关键字将对象定义转换为非定义声明,没有显式初始化器.如果存在显式初始值设定项,则定义仍然是定义,即使您添加extern它也是如此.