内核中的GCC特性了解用于C语言的GCC扩展.docx

内核中的GCC特性了解用于C语言的GCC扩展.docx

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
内核中的GCC特性了解用于C语言的GCC扩展

 GCC 和 Linux 是出色的组合。尽管它们是独立的软件,但是 Linux 完全依靠 GCC 在新的体系结构上运行。Linux 还利用 GCC 中的特性(称为扩展)实现更多功能和优化。本文讨论一些重要的扩展,讲解如何在 Linux 内核中使用它们。   GCC 当前的稳定版本(版本 4.3.2)支持 C 标准的三个版本:   International Organization for Standardization (ISO) 最初的 C 语言标准(ISO C89 或 C90)   带修正 1 的 ISO C90   当前的 ISO C99(这是 GCC 使用的默认标准,本文也假设采用这种标准)   注意:本文假设使用 ISO C99 标准。如果指定比 ISO C99 版本旧的标准,那么可能无法使用本文描述的一些扩展。可以在命令行上使用 -std 选项指定 GCC 使用的实际标准。可以通过 GCC 手册查看哪个标准版本支持哪些扩展。   可以以几种方式对可用的 C 扩展进行分类。本文把它们分为两大类:   功能性 扩展提供新功能。   优化 扩展帮助生成更高效的代码。   功能性扩展   先讨论一些扩展标准 C 语言的 GCC 扩展。   类型发现   GCC 允许通过变量的引用识别类型。这种操作支持泛型编程。在 C++、Ada 和 Java? 语言等许多现代编程语言中都可以找到相似的功能。Linux 使用 typeof 构建 min 和 max 等依赖于类型的操作。清单 1 演示如何使用 typeof 构建一个泛型宏(见 ./linux/include/linux/kernel.h)。 ????清单 1. 使用 typeof 构建一个泛型宏 #define min(x, y) ({  \   typeof(x) _min1 = (x);  \   typeof(y) _min2 = (y);  \   (void) (_min1 == _min2); \   _min1  _min2 ? _min1 : _min2; })  范围扩展   GCC 支持范围,在 C 语言的许多方面都可以使用范围。其中之一是 switch/case 块中的 case 语句。在复杂的条件结构中,通常依靠嵌套的 if 语句实现与清单 2(见 ./Linux/drivers/scsi/sd.c)相同的结果,但是清单 2 更简洁。使用 switch/case 也可以通过使用跳转表实现进行编译器优化。 ????清单 2. 在 case 语句中使用范围 ????static int sd_major(int major_idx)  {   switch (major_idx) {   case 0:   return SCSI_DISK0_MAJOR;   case 1 ... 7:   return SCSI_DISK1_MAJOR + major_idx - 1;   case 8 ... 15:   return SCSI_DISK8_MAJOR + major_idx - 8;   default:   BUG;   return 0; /* shut up gcc */   }  }    还可以使用范围进行初始化,如下所示(见 ./linux/arch/cris/arch-v32/kernel/smp.c)。在这个示例中,spinlock_t 创建一个大小为 LOCK_COUNT 的数组。数组的每个元素初始化为 SPIN_LOCK_UNLOCKED 值。 /* Vector of locks used for various atomic operations */  spinlock_t cris_atomic_locks = { [0 ... LOCK_COUNT - 1] = SPIN_LOCK_UNLOCKED};    范围还支持更复杂的初始化。例如,以下代码指定数组中几个子范围的初始值。 ????int widths = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };    零长度的数组   在 C 标准中,必须定义至少一个数组元素。这个需求往往会使代码设计复杂化。但是,GCC 支持零长度数组的概念,这对于结构定义尤其有用。这个概念与 ISO C99 中灵活的数组成员相似,但是使用不同的语法。 下面的示例在结构的末尾声明一个没有成员的数组(见 ./Linux/drivers/IEee1394/raw1394-private.h)。这允许结构中的元素引用结构实例后面紧接着的内存。在需要数量可变的数组成员时,这个特性很有用。 ????struct iso_block_store { 

文档评论(0)

2017meng + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档