【问题标题】:What is the motivation behind STDC negative definitions (for example __STDC_NO_VLA__)?STDC 否定定义(例如 __STDC_NO_VLA__)背后的动机是什么?
【发布时间】: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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这个答案是正确的,将 C11 更改为 C99。
    • @chux-ReinstateMonica 显然,这对我来说是不寻常的一天。大学里的老 F77 一定要重新浮出水面......
    • 这个答案没有解释这个决定。鉴于现有代码严格符合 C 1999 并使用可变长度数组,使用不支持可变长度数组的 C 2011 实现对其进行编译将失败,无论 VLA 宏是用积极意义还是消极意义定义的,因为现有代码将没有这样的宏测试。要获得使用 VLA 与 C 2011 一起使用的旧代码,必须插入 #if 测试。测试意义是积极的还是消极的都无关紧要,因为可以很容易地为任何一种意义设计变化。
    【解决方案2】:

    使用负面含义允许编写新代码以在 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 中没有禁忌时)。

    【讨论】:

    • 那么要求完全符合标准的肯定检查会破坏现有的 C99 代码吗?
    • @AndrewHenle:不,这与预先存在的代码无关。
    • @AndrewHenle:是的,我做到了。您询问是否要求进行肯定检查以完全符合标准会破坏现有代码。我回答没有。我补充说,这与预先存在的代码无关。在支持 VLA 的实现中使用 C 2011 编译时,严格符合 C 1999 的现有代码将编译,而不是中断,无论它是否使用 VLA,也无论 VLA-feature-test 宏具有什么意义…
    • ... 在不支持 VLA 的实现中使用 C 2011 编译时,严格符合 C 1999 和使用 VLA 的现有代码会中断。无论赋予 VLA 功能测试宏什么意义,这都是正确的。因此,预先存在的代码与功能测试宏的意义完全无关;根据是否使用 VLA 和 C 2011 实现支持它们,它要么中断,要么不中断,并且功能测试宏的可用性不会改变这一点,因为预先存在的代码不会测试宏。
    • @EricPostpischil 1. 修复 C99:#if ! defined(__STDC_VLA__) || __STDC_VLA__。 2.那为什么C11引入XXX_HAS_SUBNORM而不是引入XXX_NO_SUBNORM
    猜你喜欢
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多