首页 >后端开发 >C++ >为什么 C 11 中没有指定初始化器?

为什么 C 11 中没有指定初始化器?

Barbara Streisand
Barbara Streisand原创
2024-12-08 21:11:11671浏览

Why Were Designated Initializers Absent from C  11?

C 中的指定初始化器:为什么 C 11 中缺少指定初始化器

C 11 中指定初始化器的省略对于许多程序员来说仍然是一个有趣的问题。在 C99 中,指定的初始化语法(例如 .age = 18)允许方便地初始化结构体的特定成员。然而,C 11 中明显缺少此​​功能。

排除的理由

C 11 标准委员会多次拒绝指定初始化程序的提案。它们的基本原理源于几个固有的复杂性:

不确定的执行顺序:
C99 缺乏评估指定初始化表达式的特定规则。评估发生的顺序是不确定的,可能会导致程序行为的不一致。相比之下,C 强制执行严格的初始化子句评估顺序。

兼容性问题:
在 C 中实现指定的初始化器需要破坏与现有 C99 实现的兼容性。这会导致迁移代码的不一致和潜在错误。

嵌套和数组限制:
C99 允许嵌套指定的初始化程序和指定的数组初始化。事实证明,在不影响语言一致性的情况下将这些功能合并到 C 中具有挑战性。

C99 标准冲突:
C99 中的指定初始化程序还允许在不指定所有成员的情况下进行成员初始化。这与 C 的要求形成鲜明对比,即结构体的所有成员或全部成员都必须使用指示符进行初始化。

C 20 中的有限支持

为了响应行业需求,此后,C 委员会在 C 20 中引入了对指定初始化程序的有限支持。但是,此实现施加了一些限制,以解决上述问题。指定的初始化器必须按照严格的声明顺序使用,不支持嵌套和数组初始化,并且结构体的所有成员或全部成员都必须使用指示符进行初始化。

替代方案

尽管缺少 C99 风格的指定初始化器,C 仍提供了初始化类的替代方法成员:

  • 构造函数初始化:允许在类定义中显式成员初始化。
  • 成员初始化列表:直接启用成员初始化在构造函数内。
  • 聚合初始化:与指定初始化类似,但应用于聚合类型(例如结构)。

以上是为什么 C 11 中没有指定初始化器?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn