如果编译器定义了 __STDC_NO_VLA__,它还必须支持灵活的数组成员吗?
If a compiler defines __STDC_NO_VLA__, does it still have to support flexible array members?
在 C99 中,(结构的)灵活数组成员和可变长度数组是标准的强制性部分——符合 C99 标准的编译器(实现)必须同时支持它们。
在 C11 中,一个实现允许定义 (§6.10.8.3 Conditional feature macros):
__STDC_NO_VLA__
The integer constant 1, intended to indicate that the
implementation does not support variable length arrays or variably
modified types.
- 该定义是否意味着指定不支持 VLA 的编译器也可以不支持 §6.7.2.1 ¶3 flexible array members either — or are §6.7.2.1 ¶18 flexible array members 强制性,即使没有 VLA 支持?
我在标准中没有发现任何地方规定具有 FAM 的结构是可变修改类型,因此我认为即使不支持 VLA,也需要 C11 编译器来支持 FAM。支持这种解释的一项:具有 FAM 的结构的大小是固定的; FAM 不算作大小的一部分(而 VLA 的大小不是编译时常量)。
灵活的数组成员支持应该独立于 VLA 支持。事实上,在 C99 标准通过在 struct
.
的末尾声明一个零长度数组来命名之前,人们可以使用灵活的数组成员。
基本上,为了支持灵活的数组成员,您唯一需要做的就是更改编译器以支持 flexible[]
语法。
相比之下,支持 VLA 需要更多的努力:
- 编译时可能不再进行自动分配
sizeof
运算符必须更改为支持 运行-time evaluation
- 必须设计一个特殊的结构来保持可用的数组大小
这些实现点可能非常棘手,编译器设计者可能决定不实现 VLA。
好吧,显而易见的是,标准并没有说 FAM 是可选的,所以 FAM 不是可选的。
不过,更进一步说,标准委员会似乎不太可能愿意接受不支持 FAM 的实现。与 VLA 相比,添加对灵活数组的支持是微不足道的——稍微调整一下解析器,允许结构的最后一个成员是一个大小为零的数组,然后就此结束。 VLA 需要更繁琐的静态分析,并且可能在一些极小的独立架构中实施起来可能很繁琐或不可能。
在 C99 中,(结构的)灵活数组成员和可变长度数组是标准的强制性部分——符合 C99 标准的编译器(实现)必须同时支持它们。
在 C11 中,一个实现允许定义 (§6.10.8.3 Conditional feature macros):
__STDC_NO_VLA__
The integer constant 1, intended to indicate that the implementation does not support variable length arrays or variably modified types.
- 该定义是否意味着指定不支持 VLA 的编译器也可以不支持 §6.7.2.1 ¶3 flexible array members either — or are §6.7.2.1 ¶18 flexible array members 强制性,即使没有 VLA 支持?
我在标准中没有发现任何地方规定具有 FAM 的结构是可变修改类型,因此我认为即使不支持 VLA,也需要 C11 编译器来支持 FAM。支持这种解释的一项:具有 FAM 的结构的大小是固定的; FAM 不算作大小的一部分(而 VLA 的大小不是编译时常量)。
灵活的数组成员支持应该独立于 VLA 支持。事实上,在 C99 标准通过在 struct
.
基本上,为了支持灵活的数组成员,您唯一需要做的就是更改编译器以支持 flexible[]
语法。
相比之下,支持 VLA 需要更多的努力:
- 编译时可能不再进行自动分配
sizeof
运算符必须更改为支持 运行-time evaluation- 必须设计一个特殊的结构来保持可用的数组大小
这些实现点可能非常棘手,编译器设计者可能决定不实现 VLA。
好吧,显而易见的是,标准并没有说 FAM 是可选的,所以 FAM 不是可选的。
不过,更进一步说,标准委员会似乎不太可能愿意接受不支持 FAM 的实现。与 VLA 相比,添加对灵活数组的支持是微不足道的——稍微调整一下解析器,允许结构的最后一个成员是一个大小为零的数组,然后就此结束。 VLA 需要更繁琐的静态分析,并且可能在一些极小的独立架构中实施起来可能很繁琐或不可能。