【发布时间】:2018-04-27 13:48:56
【问题描述】:
这个简单的代码(MCVE):
#include <stdio.h>
int a = 3;
int main(){
printf("%d\n", a);
return 0;
}
int a; // This line
令我惊讶的是,GCC(MinGW GCC 4.8.2、4.9.2 和 6.3.0)没有给出任何错误,甚至没有关于标记行的警告!但是,如果我在第二个定义中为 a 分配一个值,它会这样做。
更奇怪的是,g++ 告诉我第二次重新定义是一个错误,但gcc 没有。
不应该是因为没有关键字extern而重新定义现有变量吗?
【问题讨论】:
-
未初始化的全局变量隐式为
extern。 -
如果两者都有初始化程序,它会抱怨。写成这样要求不要抱怨。二是暂定定义。你通常会先看到未初始化的声明,但写的没问题。
-
如果未初始化的全局变量隐含为
extern,则意味着int a; ... int a;将等同于extern int a; ... extern int a;,但后者不链接。
标签: c gcc redefinition