c - 如果编译器定义了 __STDC_NO_VLA__,它还必须支持灵活的数组成员吗?
问题描述
在 C99 中,灵活的数组成员(结构)和可变长度数组是标准的强制性部分——符合 C99 的编译器(实现)必须同时支持它们。
在 C11 中,允许定义(§6.10.8.3 条件特征宏):
__STDC_NO_VLA__
整数常量 1,旨在表明实现不支持可变长度数组或可变修改类型。
- 该定义是否意味着指定它不支持 VLA 的编译器也被允许不支持§6.7.2.1 ¶3 灵活数组成员- 或者即使没有 VLA 支持, §6.7.2.1 ¶18 灵活数组成员也是强制性的?
我没有在标准中发现任何地方规定具有 FAM 的结构是可变修改类型,所以我认为即使不支持 VLA,也需要 C11 编译器来支持 FAM。支持这种解释的一项:具有 FAM 的结构的大小是固定的;FAM 不计入大小的一部分(而 VLA 的大小不是编译时常数)。
解决方案
好吧,为了明确一点,标准并没有说 FAM 是可选的,所以 FAM 不是可选的。
不过,更进一步,标准委员会似乎不太可能费心接受不支持 FAM 的实现。与 VLA 相比,添加对灵活数组的支持是微不足道的——稍微调整一下解析器,允许结构的最后一个成员是大小为零的数组,然后就结束了。VLA 需要更复杂的静态分析,并且在一些小型独立架构中可能会很繁重或无法实现。
推荐阅读
- python - Python如何部分使用可迭代生成器(没有`next`)?
- terraform - 使用 terraform 将 spring-boot jar 上传到 GCE Instance
- python - 以 root 身份在启动时运行 Python 脚本
- python - Python Firebase如何检查文件是否存在于firebase存储中
- sql - 在 SQL 语句中使用未绑定的控制值
- api - Frappe 不更新数据库
- javascript - 如何使用 excel 文档作为 html 登录页面的用户名和密码数据库
- javascript - 如何在 Vue.js 中附加动态字典而不是 mutate
- javascript - 不要收到无效 ID 的 404 响应
- c++ - 为什么 clang++ 从二进制文件中删除构造函数导入?