指向不透明结构阵列的指针

时间:2013-04-09 16:30:16

标签: c gcc gcc4

我对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提交错误报告吗?

1 个答案:

答案 0 :(得分:3)

标准(以及C2011标准的N1570草案)在6.2.5(20)中说明

  

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

(我强调)

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

  

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

     

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

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

我无法找出脚注36被强调的句子替换的时间和原因,但它在November 2010之前。

似乎gcc-4.x拒绝基于新版本的代码,而gcc-3.4.6基于旧版本接受它,所以我不认为它是一个bug,代码是根据现行标准明确无效。