【发布时间】:2021-01-26 16:48:15
【问题描述】:
我知道编译器默认会向函数添加 extern。但它是否对变量做到这一点?我可以根据需要多次执行 int foo 而不会出现编译器错误,那么 extern int foo 有什么意义呢? int foo 也会是全局的吗?
【问题讨论】:
-
extern不是“全局”的意思,它表示函数或变量是在另一个编译模块中定义的,如果两者链接在一起,则可以被当前模块使用。 -
你读过C11标准中的
6.9.2 External object definitions吗? -
我以为您必须购买 C 标准的副本,无论是 C89/C99/C11 并且无法在线获得?
-
@vingarr stackoverflow.com/questions/81656/…,更具体地说是C11
-
请注意,对于 GCC 10 及更高版本,编译器默认使用
-fno-common(而不是之前的-fcommon)。这意味着如果您在没有extern前缀的标题中散布全局变量,您的软件将不会在默认编译标志下与 GCC 10 链接。该标准不允许这样做——它确实承认这是一个常见的扩展。让您的生活更简单——不要将变量定义写入没有extern前缀的头文件。