哪些GNU C扩展可用于在C99中实现并不容易?

Ykt*_*ula 7 c linux gcc c99 language-extension

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

nos*_*nos 8

这是Linux内核使用的几个gcc扩展:

  • 内联汇编
  • gcc builtins,例如__builtin_expect,__ builtin_constant,__ builtin_return_address
  • 函数属性,用于指定例如要使用的寄存器(例如__attribute __((regparm(0)),__ attribute __((packed,aligned(PAGE_SIZE)))))
  • 特定代码取决于gcc预定义的宏(例如某些版本中某些gcc错误的解决方法)
  • 开关盒中的范围(案例8 ... 15 :)

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

这些gcc细节中的大部分都是非常依赖于体系结构的,或者由于gcc的实现方式而成为可能,并且可能没有理由被C标准指定.其他只是对C的方便扩展.由于Linux内核是依赖于这些扩展而构建的,因此其他编译器必须提供与gcc相同的扩展才能构建内核.

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


Jus*_*ier 3

GCC 支持嵌套函数,它不属于 C99 标准的一部分。也就是说,需要进行一些分析才能了解它们在 Linux 内核中的实际流行程度。