You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:57:05