代码之家  ›  专栏  ›  技术社区  ›  Jonathan Leffler

如果编译器定义了\uu stdc \u no \u vla \uuuuuu,它还必须支持灵活的数组成员吗?

  •  3
  • Jonathan Leffler  · 技术社区  · 6 年前

    在C99中,灵活的数组成员(结构)和可变长度数组是符合标准的C99编译器(实现)必须同时支持这两者的强制部分。

    在C11中,允许实现定义( §6.10.8.3 Conditional feature macros )以下内容:

    __STDC_NO_VLA__ 整数常量1,用于指示 实现不支持可变长度数组或可变长度数组 修改的类型。

    我在标准中没有发现任何一个地方规定具有FAM的结构是一个可变的修改类型,所以我认为即使不支持VLA,也需要一个C11编译器来支持FAM。支持这种解释的一个项目是:具有FAM的结构的大小是固定的;FAM不算作大小的一部分(而VLA的大小不是编译时常量)。

    2 回复  |  直到 6 年前
        1
  •  7
  •   Sneftel    6 年前

    显然,标准并没有说FAM是可选的,所以FAM不是可选的。

    然而,更进一步,标准委员会似乎不太可能费心接受那些不支持FAM的实现。与VLA相比,添加对灵活数组的支持是微不足道的——稍微调整一下解析器,允许结构的最后一个成员是一个大小为零的数组,然后调用它一天。VLA需要更为精细的静态分析,并且可能需要在一些小型独立架构中进行繁重的或不可能的实现。

        2
  •  6
  •   Sergey Kalinichenko    6 年前

    灵活的阵列成员支持应该独立于VLA支持。实际上,在c99标准给出名称之前,可以使用灵活的数组成员,方法是在 struct .

    基本上,要支持灵活的数组成员,只需要更改编译器以支持 flexible[] 语法。

    相比之下,支持VLA需要付出更多的努力:

    • 自动分配可能不再在编译时完成。
    • sizeof 必须更改操作员以支持运行时评估
    • 必须设计一个特殊的结构来保持数组的大小可用

    对于编译器设计者来说,这些实现点可能很难决定不实现VLA。