c++ - 为什么在 GCC 中不推荐使用/废弃指定初始化的“标识符:表达式”形式?
问题描述
我正在做一些关于 C++ 命名参数功能的工作,特别是标记参数语法设计,我发现有一种旧的不推荐使用的指定初始化形式,它使用identifier : expression
语法而不是. identifier = expression
语法。
见https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html:
自 GCC 2.5 起已过时的另一种具有相同含义的语法是 'fieldname:',如下所示:
结构点 p = { y: yvalue, x: xvalue };
我看到这仍然受支持,但在 GCC 和 Clang 代码库中已弃用警告。(不确定 MSVC 或 EDG。)
我的问题是:为什么这被弃用和/或过时?有谁知道那里的历史,或者我怎么能找到更多?或者谁会知道更多?
解决方案
那个年代的 GCCNEWS
在源代码树中调用的文件中包含发行说明。GCC 2.5.8 发行版有 2.5的发行说明,其中说:
- 用于指定初始化器中下一个结构字段的 C 语法是 now
.FIELDNAME=
。数组初始值设定项的相应语法现在是[INDEX]=
. 例如,char whitespace[256] = { [' '] = 1, ['\t'] = 1, ['\n'] = 1 };
这已更改为符合数字 C 扩展组 (NCEG) 提出的语法。
GCC 开发人员之前已经看到需要对 C89 进行扩展,以允许我们现在称之为指定初始化程序(他们称它们为“标记元素”)。FIELDNAME: val
所以他们按照结构和联合以及[INDEX] val
数组的语法组成了自己的。显然 NCEG 的人喜欢这个,但认为其他语法会更好,尽管我不确定他们看到了它们之间的显着差异。因此 GCC 切换到 NCEG 的首选语法,这最终被 C99 采用。
旧的语法随后被认为已弃用,但显然从未放弃过支持,当 clang 出现时,显然是为了完全兼容 GCC 才选择它。
早期的 GCC 设计者非常喜欢在他们认为有用时向语言添加扩展。其中一些最终以一种或另一种形式进入了 C99,例如long long int
,可变长度数组、可变参数宏inline
和__FUNCTION__
.
推荐阅读
- python - 将 MySQL 与 PostgreSQL 上的 Timescale 进行比较,以存储一个名为 Stocks 的大约 2000 个股票代码的表,什么是更好的选择?
- python - 我在 ping 在线人的命令方面遇到了麻烦
- php - 如何重命名压缩文件名?
- python - 在 Mac 上将 pyarmor/pyinstaller 打包为 unix 可执行文件后,Python 脚本无法再找到文件
- python - 如何将 Google App Engine 更新到 Python 3.8
- r - 使用带有“gam”的 geom_smooth() 的 span 等效
- php - SQLSTATE[HY000]:一般错误:1215 无法添加外键约束错误
- ant-media-server - 当我的录制流被推送到 S3 时,我无法播放我的录制
- cplex - 如何使用 Cplex 控制 pyomo 中的打印级别
- javascript - 如何向使用特定命令的每个人发送消息?- 不和谐.js