linux内核用的c版本,linux内核 – 哪个C版本在Linux内核中使用?

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,尽管如果不是后者,我感到有些惊讶。 )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值