【发布时间】:2018-12-10 00:00:31
【问题描述】:
在 C99 中,(结构的)灵活数组成员和可变长度数组是标准的强制性部分——符合 C99 的编译器(实现)必须同时支持它们。
在 C11 中,允许定义 (§6.10.8.3 Conditional feature macros):
__STDC_NO_VLA__整数常量 1,用于表示 实现不支持可变长度数组或可变 修改类型。
- 该定义是否意味着指定不支持 VLA 的编译器也允许不支持 §6.7.2.1 ¶3 flexible array members — 或者即使没有 VLA 支持,§6.7.2.1 ¶18 flexible array members 也是强制性的?
我没有在标准中发现任何地方规定具有 FAM 的结构是可变修改类型,因此我认为即使不支持 VLA,也需要 C11 编译器来支持 FAM。支持这种解释的一项:具有 FAM 的结构的大小是固定的; FAM 不计入大小的一部分(而 VLA 的大小不是编译时常量)。
【问题讨论】:
-
我不明白为什么要支持 VLA 和灵活的数组成员。
-
@alk:就标准而言,我认为它们并不相关,但它们都涉及在运行时确定大小的数组(
malloc()等的许多用途也是如此)。我正要为 VLA 类型和带有 FAM 的结构类型的“类型大小”打印程序添加一些代码,并想知道__STDC_NO_VLA__是否意味着应该不测试 FAM 代码。 -
只是出于病态的兴趣:您是否遇到过不支持灵活数组成员的现代 C 编译器? (我希望你没有,问题是通过其他方式提出的。)
-
@NominalAnimal — 不,但我没有尝试过最近的 Microsoft 编译器。与旧版本相比,它们对 C99(可能还有 C11)有更好的支持,但我不确定它们与任一标准有多接近,或者它们的宏定义声称支持什么。
-
啊,对。我更多地考虑了各种嵌入式 C 编译器。 (正如我在其他讨论中提到的,我不再对 MS 编译器产品甚至 C 标准的未来版本抱有任何信任或希望。)
标签: c language-lawyer c11 variable-length-array flexible-array-member