C语言GNU扩展语法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
GNU C 9条扩展语法 GNC CC是一个功能非常强大的跨平台C编译器,它对标准C语言进行了一系列扩展,以增强标准C的功能,这些扩展对优化、目标代码布局、更安全的检查等方面提供了很强的支持。本文把支持GNU扩展的C语言称为GNU C。 Linux内核代码使用了大量的GNU C扩展,以至于能够编译Linux内核的唯一编译器是GNU CC,以前甚至出现过编译Linux内核要使用特殊的GNU CC版本的情况。本文是对Linux内核使用的GNU C扩展的一个汇总,希望当你读内核源码遇到不理解的语法和语义时,能从本文找到一个初步的解答,更详细的信息可以查看。文中的例子取自 Linux 2.4.18。 零长度和变量长度数组 GNU C允许使用零长度数组,在定义变长对象的头结构时,这个特性非常有用。例如: //include/linux/minix_fs.h struct minix_dir_entry { _u16 inode; char name[0]; }; 结构的最后一个元素定义为零长度数组,它不占结构的空间。在标准C中则需要定义数组长度为1,分配时计算对象大小比较复杂。 GNU C 允许使用一个变量定义数组的长度,比如: int n=0; scanf(%d,n); int array[n]; case范围 GNU C允许在一个case标号中指定一个连续范围的值,例如: //arch/i386/kernel/irq.c case 0 ... 9: c -= 0; break; ????????case a ... f: c -= a-10; break; ????????case A ... F: c -= A-10; break; 3、语句表达式 GNU C把包含在括号中的复合语句看做是一个表达式,称为语句表达式,它可以出现在任何允许表达式的地方,你可以在语句表达式中使用循环、局部变量等,原本只能在复合语句中使用。例如: //include/linux/kernel.h #define min_t(type,x,y) ({ type __x = (x); type __y = (y); __x __y ? __x: __y; }) //net/ipv4/tcp_output.c int full_space = min_t(int, tp-window_clamp,tcp_full_space(sk)); 复合语句的最后一个语句应该是一个表达式,它的值将成为这个语句表达式的值。 这里定义了一个安全的求最小值的宏,在标准C中,通常定义为: #define min(x,y) ((x) (y) ? (x) : (y)) 这个定义计算x和y分别两次,当参数有副作用时,将产生不正确的结果,使用语句表达式只计算参数一次,避免了可能的错误。语句表达式通常用于宏定义。 4、typeof 关键字 使用前一节定义的宏需要知道参数的类型,利用typeof可以定义更通用的宏,不必事先知道参数的类型,例如: //include/linux/kernel.h #define min(x,y) ({ / const typeof(x) _x = (x);?????? / const typeof(y) _y = (y);?????? / (void) (_x == _y);??????????? / _x _y ? _x : _y; }) 这里typeof(x)表示x的值类型,第3行定义了一个与 x 类型相同的局部变量 _x 并初使化为 x,注意第5行的作用是检查参数x和y的类型是否相同。typeof 可以用在任何类型可以使用的地方,通常用于宏定义。 5、可变参数宏 在GNU C中,宏可以接受可变数目的参数,就象函数一样,例如: //include/linux/kernel.h #define pr_debug(fmt,arg...) printk(KERN_DEBUG fmt,##arg) 这里arg表示其余的参数,可以是零个或多个,这些参数以及参数之间的逗号构成arg的值,在宏扩展时替换arg,例如: pr_debug(%s:%d,filename,line) 扩展为 printk(7 %s:%d, filename, line) 使用##的原因是处理arg不匹配任何参数的情况,这时arg的值为空,GNU C预处理器在这种特殊情况下,丢弃##之前的逗号,这样 pr_debug(success!/n) 扩展为??? printk(7 success!/n) 注意最后没有逗号。 6、标号元素 标准C要求数组或结构变量的初使化值必须以固定的顺序出现,在GNU C中,通过指定索引或结构域名,允许初始化值以任意顺序出现。指定数组索引的方法是在初始化值前写

文档评论(0)

封样的男子245 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档