gpt4 book ai didi

c - 使用 GCC 编译时在定义静态数组之前声明它

转载 作者:行者123 更新时间:2023-12-01 11:14:13 27 4
gpt4 key购买 nike

GCC 编译器和 Clang 编译器的行为不同,Clang 允许在定义 static 变量之前对其进行声明,而 GCC 编译器将声明(或“暂定定义”)视为一个定义。

我相信这是 GCC 中的错误,但提示它并打开错误报告不会解决我今天(或昨天)需要代码在 GCC 上编译的问题...

这是一个简单的例子:

static struct example_s { int i; } example[];

int main(void) {
fprintf(stderr, "Number: %d\n", example[0].i);
return 0;
}

static struct example_s example[] = {{1}, {2}, {3}};

使用Clang编译器,程序编译并打印出来:

Number: 1

但是,使用 GCC,代码无法编译,我得到以下错误(忽略行号):

src/main2.c:26:36: error: array size missing in ‘example’
static struct example_s { int i; } example[];
^~~~~~~
src/main2.c:33:25: error: conflicting types for ‘example’
static struct example_s example[256] = {{1}, {2}, {3}};
^~~~~~~
src/main2.c:26:36: note: previous declaration of ‘example’ was here
static struct example_s { int i; } example[];

这是 GCC 错误还是 Clang 错误?谁知道。也许如果你在其中一个团队中,你可以决定。

至于我,静态定义之前的静态声明应该是(AFAIK)有效的 C(“暂定定义”,根据 C11 标准的第 6.9.2 节)...所以我假设有一些GCC 中的扩展把事情搞砸了。

有什么方法可以添加 pragma 或其他指令以确保 GCC 将声明视为声明?

最佳答案

C11 草案在 §6.9.2 外部对象定义中有这个:

3 If the declaration of an identifier for an object is a tentative definition and has internal linkage, the declared type shall not be an incomplete type

我读这句话是说你的代码中的第一行有一个未指定长度的数组,它不是一个正确的暂定定义。不确定它会变成什么,但这可以解释 GCC 的第一条消息。

关于c - 使用 GCC 编译时在定义静态数组之前声明它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55109660/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com