gpt4 book ai didi

c - 指向不透明结构数组的指针

转载 作者:太空宇宙 更新时间:2023-11-04 02:09:44 25 4
gpt4 key购买 nike

我在使用 gcc 4.3 时遇到了一个奇怪的问题,我想知道这是编译器的特定问题还是一般的 C 问题。诚然,我使用了一个非常奇怪的结构,但我喜欢它,因为它允许我执行一些否则不可能实现的规则。该项目分为几个模块,每个模块都有一个不透明的结构。有一个typedef struct <tag> <type>在 header 和 1 个 c 文件中声明,有一个 struct tag { ... };所有函数都通过 <type> * 引用一个元素.

每个模块都知道自己的结构,其他模块的结构是不可见的。在一个模块中,我不使用 1 个元素,而是使用固定的元素数组。这意味着该模块的某些函数使用指向数组的指针。我们称该模块为wdi .所以我有例如

void write_all(wdi_type (*wdis)[MAX_WDI]);

分配(我知道非常不寻常的语法)直接返回指向数组的右指针。

wdi_type (*wdi_alloc(void))[MAX_WDI];

这在 GNU-C 3.4.6 (Solaris SPARC) 下运行良好,在 cc 下,它还编译了 sun 编译器 v12(虽然无法测试它,因为应用程序的另一部分中断了)。但是在 gcc 4.3.3 上(也在 4.4.6 x86-64 和 4.6.2 ARM 上测试过),它没有。我收到编译错误 array type has incomplete element type .我不明白为什么编译器会在那个阶段需要这些信息。它也不需要其他不透明结构的大小。

这是 gcc 错误吗?

标准是怎么说的?

我找不到相关信息。我应该向 GNU 提交错误报告吗?

最佳答案

标准(嗯,C2011标准的N1570草案)说,在6.2.5 (20)

An array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type. The element type shall be complete whenever the array type is specified.

(我强调的)

C99 标准中的相应段落不那么有力:

An array type describes a contiguously allocated nonempty set of objects with a particular member object type, called the element type.36)

36) Since object types do not include incomplete types, an array of incomplete type cannot be constructed.

它没有明确禁止为不完整的元素类型指定数组类型,只是构造这样一个数组。

脚注 36 被强调句替换的时间和原因我一直没能查到,但那是在 November 2010 之前。 .

貌似gcc-4.x拒绝了基于新版本的代码,而gcc-3.4.6基于旧版本接受了,所以我认为不是bug,代码是根据当前标准明确无效。

关于c - 指向不透明结构数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15907456/

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