Linux 核心準備硬著頭皮啟用 Microsoft C 擴充功能 (★
73 分)
近期有兩份補丁已併入 kbuild-next 開發樹,計畫於 Linux 6.19 核心合併視窗中正式啟用 `-fms-extensions` 編譯器選項。此參數在 GNU 編譯器集合 (GCC) 與 LLVM/Clang 均受支援,能在整個核心程式碼建置流程中加入微軟 C 擴展功能;其中第一份補丁將該旗標併入預設的 KBUILD_CFLAGS,第二份則確保各 CPU 架構自訂的 CFLAGS 同樣帶入此引數。若無突發異議,Linux 6.19 版本將率先包含這項改動。
`-fms-extensions` 所引入的核心功能是允許在結構體或聯合(union)中使用帶標籤的匿名子結構/聯合,並能不需命名即可直接存取其成員。這種寫法在 ISO C11 中僅允許未命名的子結構/聯合,且不得帶標籤或前置宣告;`-fms-extensions` 則放寬了這些限制,常用於「結構嵌入」(pseudo-inheritance)場景。舉例而言,可將 `struct parent` 匿名放入 `struct child`,讓子結構即具備父結構成員,達到更簡潔、節省堆疊空間的程式碼風格。
社群討論中,不少開發者釐清了此擴展與標準 C 的差異,並分享 GNU 官方文件與 ISO 標準提案(n1406)的連結以說明緣由。有意見建議,若要涵蓋更多未命名欄位特性,可考慮後續引入 `-fplan9-extensions`,該選項已支援更廣的匿名欄位用法。另有人察覺,反對聲浪多半來自對微軟品牌的刻板印象,但技術本身極為平凡,且微軟自家 MSVC 編譯器並不支援該引數,它僅為 GNU 編譯工具鏈的相容功能。
整體而言,啟用 `-fms-extensions` 可望在不破壞 ABI(應用程式二進位介面)前提下,為核心程式碼帶來更佳可讀性與開發便利性,而在 Linus Torvalds 與多位資深核心維護者未提出異議的情況下,這項改動極有機會隨 Linux 6.19 啟用。
👥
39 則討論、評論 💬
https://news.ycombinator.com/item?id=45873625