【发布时间】:2021-05-20 15:06:35
【问题描述】:
ISO/IEC 9899:202x (E) 工作草案 - 2020 年 2 月 5 日 C17..C2x N2479:
__STDC_NO_VLA__整数常量1,意在表示实现不 支持可变长度数组或可变修改类型。
问题:为什么是__STDC_NO_VLA__ 而不是__STDC_VLA__(或__STDC_HAS_VLA__)?
【问题讨论】:
标签: c language-lawyer
ISO/IEC 9899:202x (E) 工作草案 - 2020 年 2 月 5 日 C17..C2x N2479:
__STDC_NO_VLA__整数常量1,意在表示实现不 支持可变长度数组或可变修改类型。
问题:为什么是__STDC_NO_VLA__ 而不是__STDC_VLA__(或__STDC_HAS_VLA__)?
【问题讨论】:
标签: c language-lawyer
添加 正 预处理器定义以指示对可变长度数组的支持会破坏现有代码。
可变长度数组是 C99 中的必需功能,因此完全符合 C99 标准的代码可以使用可变长度数组,而无需依赖任何预处理器定义。
可变长度数组在 C11 中是可选的(the __STDC_NO_VLA__ macro first appeared in C11,不是 C17),因此它们可能不存在,并且完全符合标准的 C11 或更高版本的代码在不进行某种检查的情况下无法使用可变长度数组。因此,创建一个预处理器定义来指示它们是否受支持是有意义的。
但是使用可变长度数组而不引用任何此类定义的 C 代码已经存在,因此需要正向的预处理器定义来检查可变长度数组可能会破坏假设可变长度数组存在而无需任何检查的现有代码。
【讨论】:
VLA 宏是用积极意义还是消极意义定义的,因为现有代码将没有这样的宏测试。要获得使用 VLA 与 C 2011 一起使用的旧代码,必须插入 #if 测试。测试意义是积极的还是消极的都无关紧要,因为可以很容易地为任何一种意义设计变化。
使用负面含义允许编写新代码以在 C 2011 和 C 1999 实现中编译,这些实现将在可用时使用 VLA。
假设我们正在为 C 2011 或更高版本编写,但也希望能够为 C 1999 编译。如果代码是:
#if __STDC_VLA__
… Use VLAs.
#else
… Do not use VLAs.
#endif
那么当使用 C 1999 实现编译时,即使该实现支持 VLA,此代码也不会使用 VLA。相反,如果代码是:
#if __STDC_NO_VLA__
… Do not use VLAs.
#else
… Use VLAs.
#endif
那么当且仅当 VLA 可用时,代码才会使用 VLA(始终在 C 1999 中并且在 C 2011 中没有禁忌时)。
【讨论】:
#if ! defined(__STDC_VLA__) || __STDC_VLA__。 2.那为什么C11引入XXX_HAS_SUBNORM而不是引入XXX_NO_SUBNORM?