1

我对 gcc 4.3 有一个奇怪的问题,我想知道这是编译器的特定问题还是一般的 C 问题。诚然,我使用了一个非常奇怪的结构,但我喜欢它,因为它允许我执行一些原本不可能的规则。该项目分为几个模块,每个模块都有一个不透明的结构。标头中有一个typedef struct <tag> <type>声明,在 1 c 文件中,有一个 astruct tag { ... };和所有函数通过 a 引用一个元素<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 提交错误报告吗?

4

1 回答 1

3

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

数组类型描述了一组连续分配的具有特定成员对象类型的非空对象,称为元素类型。只要指定了数组类型,元素类型就应该是完整的。

(我强调)

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

数组类型描述了一组连续分配的具有特定成员对象类型的非空对象,称为元素类型。36)

36)由于对象类型不包括不完整类型,因此无法构造不完整类型的数组。

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

我无法找出脚注 36 何时以及为何被强调的句子所取代,但那是在2010 年 11 月之前。

看起来 gcc-4.x 拒绝了基于新版本的代码,而 gcc-3.4.6 接受了基于旧版本的代码,所以我不认为这是一个错误,并且代码根据明确无效以现行标准。

于 2013-04-09T20:22:51.170 回答