Linux kernel coding style文件并没有说明C90与C99的关系。
它建议在大多数情况下使用typedef作为“在特定情况下与标准C99类型相同的新类型”,同时阻止typedef。请注意,这并不意味着取决于C99标准,因为这种typedef可以在纯C90中定义。
后来在讨论typedef时,它说:
In certain structures which are visible to userspace, we cannot
require C99 types and cannot use the u32 form above. Thus, we use
__u32 and similar types in all structures which are shared with
userspace.
这意味着内核必须使用用C90编写的用户代码。
唯一的其他参考C99是:
Linux style for comments is the C89 “/* … */” style.
Don’t use C99-style “// …” comments.
顶级kernel documentation web page将C99标准称为“当前版本的C编程语言”(写入时可能是正确的;现在的正式版本现在是C11)。
看看内核源码,目录树中有1766个Makefile(最后一次我从git中检出)。其中只有3个参考-std = gnu99 gcc选项,而这些是用于工具的,而不是主内核本身(另外还有2个参考-std = gnu89,目前是默认的)。这意味着绝大多数的Linux内核源码被编写成使用这些选项,使其(大多数)符合C89 / C90标准和一些GNU特定的扩展。其中一些扩展是C99功能。
Linux内核的编码约定主要由Linus Torvalds控制。 This message of his从2012年4月起显示了他对(某些)C99特定功能的个人态度:
On Wed, Apr 11, 2012 at 9:28 PM, Oleg Nesterov wrote:
>
> Agreed. But,
>
> error: 'for' loop initial declaration used outside C99 mode
>
> we should change CFLAGS, I guess. BTW, personally I'd like very much
> to use "for (type var; ...")" if this was allowed.
The sad part is that if we allow that, we also get that *other* insane
C99 variable thing - mixing variables and code.
I *like* getting warnings for confused people who start introducing
variables in the middle of blocks of code. That's not well-contained
like the loop variable.
That said, most of the stuff in C99 are extensions that we used long
before C99, so I guess we might as well just add the stupid flag. And
discourage people from mixing declarations and code other ways (sparse
etc).
Linus
Bandrami’s answer部分正确地指出,C99添加的许多功能都在库中。在大多数情况下,库功能与Linux内核无关。内核不在“托管”环境中运行,并且无法访问大多数C标准库;例如,您不能在内核中使用printf(有一个类似的用于记录和调试的printk函数)。但这只是图片的一部分。 C99添加的许多功能都是以正确的语言(即由ISO C标准的第6节描述的部分),并且至少可能适用于内核源代码。
更新:
RudolfW指出this commit,这使得-std = gnu89配置(C 89/90与GNU扩展)明确。
End result: we may be able to move up to a newer stdc model
eventually, but right now the newer models have some annoying
deficiencies, so the traditional “gnu89” model ends up being the
preferred one.
这是为了应对gcc5的变化,这显然会将默认标准更改为C11(我不知道这是否是-std = c11或-std = gnu11,尽管如果不是后者,我感到有些惊讶。 )