ISO/IEC 9899:202 x (E)工作草案-2020年2月5日C17..C2x N2479:
__STDC_NO_VLA__整数常量1,用于指示实现不支持可变长度数组或可变修改的类型。
问:为什么是__STDC_NO_VLA__而不是__STDC_VLA__ (或__STDC_HAS_VLA__)?
发布于 2021-02-17 22:49:10
使用负意义允许在C 2011和C 1999实现中编写新代码,当它们可用时将使用VLA。
假设我们正在为一个C 2011实现或更高版本编写,但也希望能够为C 1999进行编译。如果守则是:
#if __STDC_VLA__
… Use VLAs.
#else
… Do not use VLAs.
#endif然后,即使该实现支持VLA,使用C 1999实现编译时,此代码也不会使用VLA。相反,如果守则是:
#if __STDC_NO_VLA__
… Do not use VLAs.
#else
… Use VLAs.
#endif然后,代码将使用VLAs当且仅当它们是可用的(总是在C 1999中,而在C 2011中没有违禁品)。
发布于 2021-02-17 17:37:10
添加正的预处理器定义以指示对可变长度数组的支持将破坏现有代码。
在C99中,可变长度数组是必需的,因此完全符合C99标准的代码可以使用可变长度数组,而不依赖于任何预处理器定义。
可变长度数组在C11 (the __STDC_NO_VLA__ macro first appeared in C11,而不是C17)中是可选的,因此它们可能不存在,完全符合标准的C11或以后的代码不能在不进行某种检查的情况下使用可变长度数组。因此,有必要创建一个预处理器定义,以指示是否支持它们。
但是C代码使用可变长度数组而不引用已经存在的任何这样的定义,因此需要一个正的预处理器定义来检查可变长度数组可能会破坏假定变量长度数组存在而不进行任何检查的现有代码。
https://stackoverflow.com/questions/66246821
复制相似问题