3

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

在 C11 中,允许定义(§6.10.8.3 条件特征宏):

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

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

4

2 回答 2

9

好吧,为了明确一点,标准并没有说 FAM 是可选的,所以 FAM 不是可选的。

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

于 2018-07-01T15:43:10.663 回答
6

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

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

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

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

这些实现点可能足以让编译器设计者决定不实现 VLA。

于 2018-07-01T15:43:01.127 回答