Synth Daily

Linux内核或将“硬着头皮”支持微软C扩展

Linux 内核正计划进行一项有争议的改动,即通过启用 -fms-extensions 编译器参数来支持微软的非标准 C 语言扩展。这一变化预计将在 Linux 6.19 版本中正式合入,旨在让内核代码可以使用匿名嵌套结构体等特性,从而使代码更简洁并可能节省栈空间。尽管该提议过去曾被多次拒绝,但这次似乎获得了足够的支持,包括 Linus Torvalds 本人。

具体变化:启用微软 C 扩展

两项补丁已被提交到内核的 kbuild-next 开发分支,其核心作用是在全局范围内为 GCC 和 LLVM/Clang 编译器启用 -fms-extensions 参数。

这个参数允许编译器识别并使用微软 Visual C/C++ 编译器支持的一些非标准 C 语言特性。对内核开发而言,最重要的特性是:

  • 支持匿名嵌套结构体/联合体:允许在一个结构体或联合体中直接匿名地包含另一个,简化数据结构定义。

为何要做出这一改变?

尽管引入一个带有“微软”标签的特性听起来有些奇怪,但此举背后有实际的技术考量。开发者认为,启用该扩展能带来多方面的好处。

启用 -fms-extensions 可以让一些代码变得更漂亮。虽然每次讨论时,替代方案都被认为“不算太糟”,不值得为此增加一个编译器标志,但这有点像一个先有鸡还是先有蛋的问题。

主要优势包括:

  • 提升代码可读性:代码结构可以变得更清晰、更直观,减少冗余的定义。
  • 节省栈空间:在某些情况下,更优化的数据结构可以减少内存占用。
  • 简化开发:为开发者提供了一种更灵活的编码方式。

争议与现状

在过去,类似的提议都因各种原因未能通过。许多开发者认为,为了个别情况的“代码美观”而引入一个非标准的编译器标志是不值得的。

然而,这次情况有所不同。补丁已经进入了 kbuild-next 开发树,意味着如果没有来自核心开发者或 Linus Torvalds 本人的强烈反对,它们很可能会在下一个合并窗口被正式合入 Linux 6.19 内核。目前的讨论表明,Linus Torvalds 并不反对这一改动。