有哪些GNU C扩展是在C99中不容易实现的?

8
为什么Linux内核只能使用GCC编译?一些项目真正需要哪些GNU C扩展,为什么需要呢?

如果你仔细搜索,你可以找到一个带有链接的问题,其中包含其他已成功构建Linux内核的编译器。至少对于某些内核版本,tcc可以做到这一点。 - dmckee --- ex-moderator kitten
本文介绍了使用的扩展:Linux内核中的GCC黑科技。其中一些是微不足道的,而另一些则不是(主要是优化技巧)。 - liori
1
标题和问题不太匹配。 - David Thornley
dmckee:为了能够使用tcc编译Linux内核,需要对其进行一些补丁。 - Yktula
4个回答

10

这里有几个Linux内核使用的gcc扩展功能:

  • 内联汇编
  • gcc内建函数,例如__builtin_expect,__builtin_constant,__builtin_return_address
  • 函数属性用于指定使用哪些寄存器(例如__attribute__((regparm(0)),__attribute__((packed, aligned(PAGE_SIZE)))))
  • 根据gcc预定义宏编写的特定代码(例如特定版本中某些gcc错误的解决方法)
  • 在switch语句中使用范围(case 8 ... 15:)

这里还有一些:http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/

许多这些gcc特定细节非常依赖于架构,或者是因为gcc的实现方式而变得可能,并且可能没有必要通过C标准进行指定。 其他一些只是C语言的方便扩展。 由于Linux内核依赖这些扩展功能构建,因此其他编译器必须提供与gcc相同的扩展功能才能构建内核。

这并不是说Linux必须依赖于gcc的这些功能,例如NetBSD内核很少依赖于gcc 特定的东西。


IBM Link已过时。 - Philipp Ludwig

3

GCC支持嵌套函数,但这不是C99标准的一部分。也就是说,在Linux内核中实际上有多少嵌套函数需要进行一些分析。


2

Linux内核是为GCC编译而写的,因此标准兼容性从未成为内核开发人员的目标。

如果GCC提供了一些有用的扩展,可以使编码更容易,或者使编译后的内核更小、更快,那么使用这些扩展就是一个自然的选择。


0

我猜它们并不是真的那么必要。只是有很多有用的扩展,而且对于Linux内核来说,跨编译器可移植性并不是放弃这些好处的主要问题。更不用说摆脱依赖扩展所需的大量工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接