在 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中文網其他相關文章!