在 C 11 中指定指定初始化器的缺失
在编程领域,指定初始化器在 C99 标准中占据着重要地位。这些初始化程序允许开发人员有选择地为结构成员分配值,从而增强代码的可读性和简洁性。然而,C 11 标准中明显缺少这些初始化程序,这促使人们对这种遗漏背后的理由进行调查。
C 11 标准委员会反复审议了包含指定初始化程序的问题,考虑了采用特征。然而,共识仍然是坚决拒绝此类提议。委员会认为,实现指定初始化器的努力在历史上遇到了难以克服的挑战。
考虑 C99 中的以下代码片段:
struct Person { int height; int weight; int age; }; int main() { Person p { .age = 18 }; }
此代码为 Person 的 Age 成员分配一个值struct,同时保留其他成员未初始化。 C99 允许这种选择性初始化,但 C 11 不允许。
C 11 中排除指定初始化器的主要原因之一源于 C99 中初始化器的评估顺序不可预测。该标准模糊地将这种顺序描述为“不确定的顺序”,为意外的程序行为留下了空间。例如,如果 Person 结构体的初始化涉及具有副作用的函数调用,则执行顺序可能会产生意想不到的后果,而编译器不一定会标记这种结果。
相比之下,C 对初始化程序有严格的要求 -列表评估,确保初始化程序按照它们出现的顺序执行。执行这样的命令需要破坏与以前的 C99 设计的兼容性,委员会认为这是不可接受的。
虽然 C 11 中缺乏指定初始化器最初可能引起了批评,但将它们包含在 C 中所施加的限制20 解决了对不确定行为的担忧。 C 20 中的标准化评估顺序为开发人员提供了对初始化过程更大的确定性和控制力。
以上是为什么 C 11 指定初始化器不存在?的详细内容。更多信息请关注PHP中文网其他相关文章!