首頁 >後端開發 >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