struct color
{
int r;
int g;
int b;
};
#include "Alfa.h"
void foo(struct color);
#include "Alfa.h"
void bar(struct color);
#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说:
在结构或工会分类器中存在结构范围列表,在翻译单元中宣布了一种新类型。
如果同一类型的两个声明具有成员 - 陈述 或枚举列表,一个不得嵌套在另一个中,两种声明均应满足兼容类型的所有要求(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。)
可以在链接的PDF中找到标准用C23的措辞中确切更改的内容。
根据C17标准,您可以在同一范围内声明相同类型(结构)。从C17标准(6.7.2.3标签),语义))
7示例1以下示例显示了在相同范围中相同结构,联合或枚举类型的重新分配:4
具有相同范围并使用相同标签的结构,联合或枚举类型的所有声明声明相同的类型。不管是否有标签或类型的其他声明在同一翻译单元中,该类型是不完整的132),直到列表结束后立即定义内容,然后完成此后完成 但看来这个概念出现了问题,在C23中,此报价是一个例子,以使其清晰
// TU 2
struct foo { int a; } p;
void bar(void)
{
struct foo { int a; } q;
}
// TU 3
struct foo { int a; } r;