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,它只声明变量而没有分配内存.请说明编译器如何以两种方式运行.
你的问题的前提是不正确的.这个
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它也是如此.