C语言 如果编译器定义了__STDC_NO_VLA__,它是否仍然必须支持灵活的数组成员?



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

在 C11 中,允许实现定义(§6.10.8.3 条件功能宏(:

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

  • 该定义是否意味着指定不支持VLA的编译器也允许不支持§6.7.2.1 ¶3 灵活数组成员 — 或者即使没有VLA支持,§6.7.2.1 ¶18 灵活数组成员也是强制性的?

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

好吧,显而易见的是,标准并没有说FAM是可选的,所以FAM不是可选的。

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

灵活的阵列成员支持应独立于 VLA 支持。事实上,在 C99 标准通过在struct末尾声明一个零长度数组来命名之前,可以使用灵活的数组成员。

基本上,为了支持灵活的数组成员,您唯一需要做的就是更改编译器以支持flexible[]语法。

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

  • 编译时可能不再执行自动分配
  • 必须更改sizeof运算符以支持运行时计算
  • 必须设计一个特殊的结构来保持阵列的大小可用

这些实现点可能很棘手,编译器设计人员决定不实现 VLA。

最新更新