【发布时间】:2019-10-04 23:39:27
【问题描述】:
我了解 C 中的文件范围变量默认为 extern - 即使没有明确指定(如对 Global variables in C are static or not? 的回答中所述)。
不过我也知道,如果a.h声明了extern int x = 10;,而b.c想访问x,则需要声明为extern。
为什么会这样?为什么不直接访问x 而无需任何额外的extern 内容?这种机制的技术解释是什么?
【问题讨论】:
-
我知道 C 中的文件范围变量默认是外部变量 - 不,它们不是。他们可以在其他翻译单元中为
externed,除非他们是static。h文件与它有一点关系,因为它们只是以文本方式粘贴到源代码中。如果你有extern int x,它和你把它放在包含c文件中的一样。 -
请注意,当设置为 fussy(使用
-Werror)时,GCC (9.1.0) 会说:ext59.c:1:12: error: ‘x’ initialized and declared ‘extern’ [-Werror]当被要求编译extern int x = 10;— 你不应该将extern与初始化程序结合使用. (没有-Werror,它只是一个警告,即使没有警告请求也会出现。)