【问题标题】:Pointer to array of opaque structures指向不透明结构数组的指针
【发布时间】:2013-04-09 16:30:16
【问题描述】:

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

【问题讨论】:

    标签: c gcc gcc4


    【解决方案1】:

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

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

    (我强调)

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

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

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

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

    我无法找出脚注 36 何时以及为何被替换为强调句,但它在 November 2010 之前。

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

    【讨论】:

    • 谢谢,我就是这么想的。我将不得不更改我的代码。遗憾的是,这样更安全,通过使用普通的wdi_type * 而不是wdi_type (*wdis)[MAX_WDI],编译器会丢失一个用于类型检查的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 2012-08-03
    相关资源
    最近更新 更多