设置首页  |   加入收藏  |  联系我们   
您的位置: 主页>Linux知识>内核研究>正文
GNUC扩展:Linux操作系统的内核使用
文章来源:  编辑:  发布时间:2007-10-29

GNC CC 是一个功能非常强大的跨平台 C 编译器,它对 C 语言提供了很多扩展,

这些扩展对优化、目标代码布局、更安全的检查等方面提供了很强的支持。本文把

支持 GNU 扩展的 C 语言称为 GNU C。

Linux 内核代码使用了大量的 GNU C 扩展,以至于能够编译 Linux 内核的唯一编

译器是 GNU CC,以前甚至出现过编译 Linux 内核要使用特殊的 GNU CC 版本的情

况。本文是对 Linux 内核使用的 GNU C 扩展的一个汇总,希望当你读内核源码遇

到不理解的语法和语义时,能从本文找到一个初步的解答,更详细的信息可以查看

gcc.info。文中的例子取自 Linux 2.4.18。

语句表达式

==========

GNU C 把包含在括号中的复合语句看做是一个表达式,称为语句表达式,它可以出

现在任何允许表达式的地方,你可以在语句表达式中使用循环、局部变量等,原本

只能在复合语句中使用。例如:

++++ include/linux/kernel.h

159: #define min_t(type,x,y) \

160: ({ type __x = (x); type __y = (y); __x < __y ? __x: __y; })

++++ net/ipv4/tcp_output.c

654: int full_space = min_t(int, tp->window_clamp, tcp_full_space(sk));

复合语句的最后一个语句应该是一个表达式,它的值把成为这个语句表达式的值。

这里定义了一个安全的求最小值的宏,在标准 C 中,通常定义为:

#define min(x,y) ((x) < (y) ? (x) : (y))

这个定义计算 x 和 y 分别两次,当参数有副作用时,把产生不正确的结果,使用

语句表达式只计算参数一次,避免了可能的错误。语句表达式通常用于宏定义。

Typeof

======

使用前一节定义的宏需要知道参数的类型,利用 typeof 可以定义更通用的宏,不

必事先知道参数的类型,例如:

++++ include/linux/kernel.h

141: #define min(x,y) ({ \

142: const typeof(x) _x = (x); \

143: const typeof(y) _y = (y); \

144: (void) (&_x == &_y); \

145: _x < _y ? _x : _y; })

这里 typeof(x) 表示 x 的值类型,第 142 行定义了一个与 x 类型相同的局部变

量 _x 并初使化为 x,注意第 144 行的作用是检查参数 x 和 y 的类型是否相同。

typeof 可以用在任何类型可以使用的地方,通常用于宏定义。

零长度数组

==========

 
Tags:使用 操作系统 扩展 语句 表达式 定义 一个 GNU 类型

Google
 
上一篇: Linux系统内核模块和驱动的编写   下一篇: Linux内核2.6.16版发布 支持Cell芯片
【返回顶部】 【打印】 【大】 【中】 【小】 【关闭】

 我来说两句
用户名: 新注册) 密码: 匿名评论 [论坛讨论]
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 相关文章
 热门文章

 
版权所有  2005-2006  Linux集中营  闽ICP备07500055号