两个已排入 Linux 内核构建系统开发树 kbuild-next 的补丁将允许在编译 Linux 内核时,GCC 和 LLVM/Clang 使用 Microsoft C 扩展的-fms-extensions 编译器参数。由于这些补丁位于 kbuild-next 中,它们很可能会在下个月的 Linux 6.19 内核合并窗口期间提交,但还需观察是否会有任何关于这一变化的最后时刻反对意见。
-fms-extensions 编译器选项由 GNU 编译器集合和 LLVM/Clang 支持,允许启用在 Microsoft 头文件中使用的一些非标准 C/C++结构,并由 Microsoft Visual C/C++编译器认可。出于 Linux 内核开发的目的,启用 Microsoft C 扩展将允许在另一个结构/联合中匿名包含一个标记的结构或联合。
许多年前,就有补丁被提出,无条件地启用 Linux 内核的-fms-extensions,但它们并没有通过 Linux 内核邮件列表。但现在,随着这两个补丁进入 kbuild-next,这意味着它很可能会在没有任何著名 Linux 内核开发者或 Linus Torvalds 本人的反对意见的情况下,提交给 Linux 6.19 内核合并窗口。
Rasmus Villemoes 与 Kbuild 进行了争论:启用-fms-extensions,这将允许“更漂亮的代码”,其他人过去也指出,这有可能节省栈空间,并在整体上能够利用 Microsoft C 的行为:
“偶尔,启用-fms-extensions 可能会让代码看起来稍微美观一些。但每次提出这个要求时,不得不使用的代码都被认为‘还算不错’,不值得引入另一个编译器标志。
这可能对每个具体案例都适用,但这也形成了一个鸡生蛋还是蛋生鸡的情况。
如果我们像 Linus 说的那样“咬紧牙关”,一次性启用它,那么它将在需要时随时可用,无需任何个别案例来证明其合理性。
在 lore.kernel.org 的搜索中提供了以下示例:
– https://lore.kernel.org/lkml/200706301813.58435.agruen@suse.de/
– https://lore.kernel.org/lkml/20180419152817.GD25406@bombadil.infradead.org/
– https://lore.kernel.org/lkml/170622208395.21664.2510213291504081000@noble.neil.brown.name/
– https://lore.kernel.org/lkml/87h6475w9q.fsf@prevas.dk/
– https://lore.kernel.org/lkml/CAHk-=wjeZwww6Zswn6F_iZTpUihTSNKYppLqj36iQDDhfntuEw@mail.gmail.com/
毫无疑问,代码中还有更多地方也可以使用这种方法,但“-fms-extensions”并没有在任何讨论中提到。”
第二个补丁是 kbuild:为具有专用 CFLAGS 的区域添加’-fms-extensions’,以确保为依赖于自己 CFLAGS 设置的 CPU 架构传递-fms-extensions,而不是主 KBUILD_CFLAGS。
Linus Torvalds 在之前的邮件列表讨论中发表了意见,看起来他并不反对从 Linux 6.19 内核开始启用-fms-extensions。

启用 -fms-extensions 将允许 C 代码看起来更好,尽管有些人可能觉得允许微软 C 行为在主线 Linux 内核编码中是错误的。
转自 The Linux Kernel Looks To “Bite The Bullet” In Enabling Microsoft C Extensions – Phoronix