C 11 中的指定初始值设定项列表排除
C 11 缺乏对指定初始值设定项列表的支持,这是 C99 中存在的功能。这一遗漏让一些开发人员感到困惑,他们想知道为什么新标准中没有包含如此方便的语法。
基本原理
C 标准委员会一直拒绝将指定的初始值设定项列表合并到语言中。它们的基本原理源于几个固有的挑战:
求值顺序不确定性:
在 C99 中,指定初始化子表达式的求值顺序是不确定的。这可能会导致意外的行为,特别是当初始化涉及交互函数或副作用时。
兼容性违规:
如果 C 要实现具有不确定评估的指定初始值设定项列表命令,它将破坏与现有 C99 实现的兼容性,而现有 C99 实现通常提供一致的评估
可行性问题:
标准委员会多次对以符合严格初始化列表要求的方式实现指定初始化列表的可行性表示怀疑C (11.6.4[dcl.init.list]4).
C 中的指示符限制20
虽然指定的初始化器列表仍然被排除在 C 11 和 C 17 之外,但 C 20 标准引入了部分支持和限制,以确保确定性和兼容性。这些限制包括:
结论
从 C 11 中排除指定初始化器列表是标准委员会出于对评估顺序不确定性的担忧而故意做出的决定,兼容性问题和实施挑战。虽然 C 20 最终添加了有限的支持,但 C 标准继续专注于执行严格的初始化程序顺序并避免可能损害程序正确性或可移植性的不可预测的行为。
以上是为什么指定初始化列表被排除在 C 11 之外?的详细内容。更多信息请关注PHP中文网其他相关文章!