首页 > 解决方案 > 为什么在 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。)

我的问题是:为什么这被弃用和/或过时?有谁知道那里的历史,或者我怎么能找到更多?或者谁会知道更多?

标签: c++cgcc

解决方案


那个年代的 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__.


推荐阅读