我对gcc 4.3有一个奇怪的问题,我想知道它是编译器的特定问题还是一般的C问题。
当然,我使用了一个非常奇怪的结构,但我喜欢它,因为它允许我强制执行一些否则将无法实现的规则。
该项目分为几个模块,每个模块都有一个不透明的结构。
标题和1 c文件中有一个typedef struct <tag> <type>
声明,有一个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(由于app的另一部分中断,无法测试它)。
在gcc 4.3.3上(也在4.4.6 x86-64和4.6.2 ARM上测试过),它没有。我收到编译错误array type has incomplete element type
。
我不明白为什么编译器会在那个阶段需要那些信息。它也不需要其他不透明结构的大小。
这是一个gcc bug吗?
标准说什么?
我无法找到有关它的东西。我应该向GNU提交错误报告吗?
答案 0 :(得分:3)
标准(以及C2011标准的N1570草案)在6.2.5(20)中说明
数组类型描述了具有特定成员对象类型的连续分配的非空对象集,称为元素类型。 只要指定了数组类型,元素类型就应该完整。
(我强调)
C99标准中的相应段落不太有力:
数组类型描述了具有特定成员对象类型的连续分配的非空对象集,称为元素类型。 36)
36)由于对象类型不包含不完整类型,因此无法构造不完整类型的数组。
它没有明确禁止为不完整的元素类型指定数组类型,只构造这样的数组。
我无法找出脚注36被强调的句子替换的时间和原因,但它在November 2010之前。
似乎gcc-4.x拒绝基于新版本的代码,而gcc-3.4.6基于旧版本接受它,所以我不认为它是一个bug,代码是根据现行标准明确无效。