error:GCC和C23

问题描述 投票:0回答:2
中文件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

生成以下内容:

error: redefinition of 'struct color'

无论如何,似乎仅使用COMPILER生成误差C23以下(即C17,C11等)。

这是一个错误或有所更改吗?

C2018 6.7.2.1 8说:

在结构或工会分类器中存在结构范围列表,在翻译单元中宣布了一种新类型。

c gcc c23
2个回答
4
投票
C2024 6.7.3.4,关于标签,将其添加到C 2018中的相应子句,6.7.2.3:

如果同一类型的两个声明具有成员 - 陈述 或枚举列表,一个不得嵌套在另一个中,两种声明均应满足兼容类型的所有要求(6.2.7),并要求相应的结构或工会类型的相应成员具有相同的要求(而不仅仅是兼容)类型

NATEELDRIDGE还在评论中指出,C 2024省略了C 2018 6.7.2.3 1:

特定类型最多应最多定义其内容。

因此,标准似乎有故意的改变,以重新定义结构或联合(实际上相同的定义)。

这似乎已根据提案进行了更改

N3037改进了TAG兼容性的规则,该规则兼容了C23。 提案:

带有相同标签和内容的标签类型已经在翻译中兼容 单位,但从不在同一翻译单元内。在下面的示例中,“ p”和“ r”和 另外,“ Q”和“ R”具有兼容类型,而“ P”和“ Q”没有兼容类型。

-std

(以上是根据C17 6.2.7。)


1
投票
在这里,提出的是1)用相同的标签和内容兼容的标记类型 在同一翻译单元中,到2)允许重新支配相同的标签类型。

可以在链接的PDF中找到标准用C23的措辞中确切更改的内容。

根据C17标准,您可以在同一范围内声明相同类型(结构)。

从C17标准(6.7.2.3标签),语义))

4

具有相同范围并使用相同标签的结构,联合或枚举类型的所有声明声明相同的类型。不管是否有标签或类型的其他声明在同一翻译单元中,该类型是不完整的132),直到列表结束后立即定义内容,然后完成此后完成
但看来这个概念出现了问题,在C23中,此报价是一个例子,以使其清晰
7示例1以下示例显示了在相同范围中相同结构,联合或枚举类型的重新分配:

// TU 2 struct foo { int a; } p; void bar(void) { struct foo { int a; } q; } // TU 3 struct foo { int a; } r;

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.