为何GCC在C23标准下未报struct color重定义错误?
这不是Bug,是C23标准的明确变更
你的代码在C23标准下编译不报错,是因为C23对结构体重复定义的规则做了调整,具体如下:
旧标准(C17/C11及更早)的规则
在C23之前的标准中,同一个翻译单元里不能重复定义同一个结构体类型。你的代码里,Alfa.h被Beta.h和Gamma.h分别包含,而main.c同时引入了这两个头文件,导致struct color在翻译单元中被定义了两次,所以GCC用旧标准编译时会触发error: redefinition of 'struct color'错误,这符合当时的标准要求。
C23标准的新规则
C23标准放宽了这一限制:如果同一个翻译单元中多次定义的结构体类型完全兼容(成员的类型、名称、顺序完全一致),编译器会将它们视为同一个类型,不会报错。你的代码里两次定义的struct color内容完全相同,刚好符合这个新规则,所以GCC用-std=c23编译时不会报错。
注意:如果多次定义的结构体内容不一致(比如成员顺序不同、类型不匹配),即使在C23下,GCC依然会抛出重定义错误,因为这属于不兼容的重复定义。
你的代码示例
文件Alfa.h:
struct color { int r; int g; int b; };
文件Beta.h:
#include "Alfa.h" void foo(struct color);
文件Gamma.h:
#include "Alfa.h" void bar(struct color);
文件main.c:
#include "Beta.h" #include "Gamma.h" int main(void) { return 0; }
编译命令:
gcc Alfa.h Beta.h Gamma.h main.c -std=c23 -Wall -Wextra -Wpedantic -o prog
内容的提问来源于stack exchange,提问作者xdevel2000
相关产品推荐
相关产品推荐

