当我们声明任何全局变量时,例如
int x;
它等效于
extern int x;
现在,默认情况下,全局变量由编译器初始化为0,这意味着它们是分配的内存。但是,如果我只是写
extern int x;
那么,这只会声明变量,而不会分配内存。因此,我的查询是,如果我在int x
之前编写 extern ,或者我不编写它,在全局变量的情况下,编译器对它们的处理方式有何不同?在我简单地编写int x
的情况下,它同时分配内存并在 int x
之前将 extern 放置,而在我编写extern int x
的情况下,它仅声明该变量,而不会分配内存。请澄清编译器在这两种方面的行为。
您问题的前提是不正确的。这个
int x;
是一个暂定定义(在翻译单元的末尾将变成x
的正常定义)。
这个
extern int x;
是一种非定义声明,这根本不是定义。
它们甚至都不相等。
与您原始定义相当的宽松等效物将是
extern int x = 0;
这是一个定义。但这不是确切的等效物,因为此定义不是暂定的。
关键字extern
将对象定义变成了不定定义的声明,如果(并且仅在)中,没有明确的初始化器。如果存在显式初始化器,即使您向其添加extern
,定义仍然是一个定义。
这可以通过了解外部对象定义和暂定定义来回答。
引用 C11
,第§6.9.2章,(强调矿山)
对具有文件范围的对象的标识符声明,而没有初始化器,并且 没有存储类规范符或存储级规范仪静态,则构成a 暂定定义。如果翻译单元包含一个或多个暂定定义 标识符,翻译单元不包含该标识符的外部定义,然后 该行为就像翻译单元包含文件范围声明一样 标识符,带有复合类型的标识符,截至翻译单元的末端,初始化器 等于0。