当前位置: 首页 > 科技观察

Linux内核从C89迁移到C11的新进展

时间:2023-03-15 19:00:25 科技观察

内核开发者ArndBergmann发布了一个新补丁,允许Linux内核在为C11指定GNU方言时默认使用“-std=gnu11”。这样内核将允许很好的C99/C11功能,而不是仅限于C89。鉴于此更改已得到LinusTorvalds的认可,如果未发现基本问题,它可能会被带入下一个内核合并窗口。在补丁讨论中,Linus提出了将C的标准版本从gnu89更改为gnu99的选项,这允许在for()循环中声明变量。虽然C99、C11和后来的标准引入了许多其他特性,但其中大部分也已经作为GNU扩展在gnu89中可用。早些时候,gcc-5尝试默认为-std=gnu1,但失败了,因为当时这会导致旧编译器上指定初始化器的警告。现在gcc-5.1是用于构建内核的最低编译器版本,这不再是问题。同样,“内联”函数的行为在gnu89和gnu11之间发生了变化,但这已通过将“内联”定义为包含__attribute__((gnu_inline))以允许使用clang构建来解决。剩下的一个小问题是,在使用-Werror构建时添加了一个gcc警告负整数移位,它与“makeW=1”选项一起出现,并且内核中的三个驱动程序始终启用-Werror,但目前仅在i915驱动程序。为了安全起见,请将-Wno-shift-negative-value添加到Makefile中的任何-Wextra。NathanChancellor在arm的系统标题中报告了一个额外的-Wdeclaration-after-statement警告,这仍然需要一个解决方法。gnu99、gnu11、gnu1x和gnu17之间的差异相当小,主要影响内核从不启用的-Wpedantic级别的警告。在这些版本之间,gnu11是所有受支持的编译器版本支持的最新版本,尽管它只是gcc-5的默认版本,而所有其他受支持的gcc或clang版本默认为gnu1x/gnu17。事件的前因后果是Linux内核社区就内核是否采用现代C语言标准进行了讨论。Linus在讨论中提出了从C89升级到C99的想法;并说内核代码一直卡在C89的原因之一是老版本的编译器gcc会出现奇怪的问题,导致initializer坏掉。但现在内核要求的最低GCC版本已经提升到v5.1,那些错误可能不再相关。最后证明,在当前内核的最低编译器要求和当前代码的条件下,他们实际上可以开始使用C11构建内核。ArndBergmann建议直接升级到C11甚至C2x。虽然他不确定C11是否会带来任何对内核有用的新东西,但升级到C17或C2x会破坏对gcc-5/6/7的支持;所以升级到C11比较容易,飞跃太大内核社区可能不会接受。Linus赞同这个想法。在Bergmann确认此举可行后,Linus宣布他将在下一个内核版本v5.18中尝试使用C11标准。有关详细信息,请参阅邮件列表。本文转自OSCHINA文章标题:Linux内核从C89迁移到C11的新进展本文地址:https://www.oschina.net/news/184534/linux-kernel-c89-to-c11