多个定义在gcc或clang中都不会给出错误或警告

多个定义在gcc或clang中都不会给出错误或警告,c,gcc,compilation,clang,warnings,C,Gcc,Compilation,Clang,Warnings,如果我有 #include <stdio.h> int a; //definition int a; //definition int a; //definition int a; //definition int a; //definition int main() { return 0; } #包括 INTA//定义 INTA//定义 INTA//定义 INTA//定义 INTA//定义 int main(){ 返回0; } 例如,尽管多次定义了一个变量,但我不会从g

如果我有

#include <stdio.h>
int a; //definition
int a; //definition
int a; //definition
int a; //definition
int a; //definition
int main() {
    return 0;
}
#包括
INTA//定义
INTA//定义
INTA//定义
INTA//定义
INTA//定义
int main(){
返回0;
}

例如,尽管多次定义了一个变量,但我不会从gcc或clang中得到任何错误或警告。为什么?我想我可以任意多次声明变量,但只能定义一次?

这是一个暂定定义。也就是说,没有初始值设定项的文件范围变量的每个声明都被视为声明,而不是定义。定义在翻译单元末尾隐式生成,初始值设定项等于0

来自C标准(6.9.2外部对象定义)

2具有文件作用域的对象的标识符声明 没有初始值设定项,也没有存储类说明符或 存储类说明符static构成了一个 定义。如果翻译单元包含一个或多个暂定 标识符的定义,并且翻译单元不包含 该标识符的外部定义,则该行为 就好像翻译单元包含一个文件范围声明一样 标识符,具有转换结束时的复合类型 单位,初始值设定项等于0


这就解释了为什么它不会生成错误,但警告可能仍然是合适的。这是因为从不同的头文件中有多个暂定定义是很常见的吗?@Barmar我认为编译器可以有一个设置警告的选项。例如,对于多个函数声明,一些编译器在默认情况下会发出警告。我在Mac上尝试了
-Weverything
,但它没有对此发出警告。@Barmar编译器的开发人员似乎认为这不是必需的。:)很明显,尽管这似乎是一件很明显要警告的事情,除非有充分的理由不这样做。