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



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

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。

相关内容

  • 没有找到相关文章

最新更新