首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >负定义背后的动机是什么(例如__STDC_NO_VLA__)?

负定义背后的动机是什么(例如__STDC_NO_VLA__)?
EN

Stack Overflow用户
提问于 2021-02-17 17:14:06
回答 2查看 143关注 0票数 1

ISO/IEC 9899:202 x (E)工作草案-2020年2月5日C17..C2x N2479:

__STDC_NO_VLA__整数常量1,用于指示实现不支持可变长度数组或可变修改的类型。

问:为什么是__STDC_NO_VLA__而不是__STDC_VLA__ (或__STDC_HAS_VLA__)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-17 22:49:10

使用负意义允许在C 2011和C 1999实现中编写新代码,当它们可用时将使用VLA。

假设我们正在为一个C 2011实现或更高版本编写,但也希望能够为C 1999进行编译。如果守则是:

代码语言:javascript
复制
#if __STDC_VLA__
   … Use VLAs.
#else
   … Do not use VLAs.
#endif

然后,即使该实现支持VLA,使用C 1999实现编译时,此代码也不会使用VLA。相反,如果守则是:

代码语言:javascript
复制
#if __STDC_NO_VLA__
   … Do not use VLAs.
#else
   … Use VLAs.
#endif

然后,代码将使用VLAs当且仅当它们是可用的(总是在C 1999中,而在C 2011中没有违禁品)。

票数 2
EN

Stack Overflow用户

发布于 2021-02-17 17:37:10

添加正的预处理器定义以指示对可变长度数组的支持将破坏现有代码。

在C99中,可变长度数组是必需的,因此完全符合C99标准的代码可以使用可变长度数组,而不依赖于任何预处理器定义。

可变长度数组在C11 (the __STDC_NO_VLA__ macro first appeared in C11,而不是C17)中是可选的,因此它们可能不存在,完全符合标准的C11或以后的代码不能在不进行某种检查的情况下使用可变长度数组。因此,有必要创建一个预处理器定义,以指示是否支持它们。

但是C代码使用可变长度数组而不引用已经存在的任何这样的定义,因此需要一个正的预处理器定义来检查可变长度数组可能会破坏假定变量长度数组存在而不进行任何检查的现有代码。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66246821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档