Linux内核中的GCC有什么特
Linux®
内核使用 GNU Compiler Collection (GCC) 套件的几个特殊功能。这些功能包括提供快捷方式和简化以及向编译器提供优化提示等等。了解这些特殊的 GCC 特性,学习如何在 Linux 内核中使用它们。
GCC 和 Linux 是出色的组合。尽管它们是独立的软件,但是 Linux 完全依靠 GCC 在新的体系结构上运行。Linux 还利用 GCC 中的特性(称为扩展)实现更多功能和优化。本文讨论一些重要的扩展,讲解如何在 Linux 内核中使用它们。
GCC 当前的稳定版本(版本 4。3。2)支持 C 标准的三个版本:
International O...全部
Linux®
内核使用 GNU Compiler Collection (GCC) 套件的几个特殊功能。这些功能包括提供快捷方式和简化以及向编译器提供优化提示等等。了解这些特殊的 GCC 特性,学习如何在 Linux 内核中使用它们。
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 手册查看哪个标准版本支持哪些扩展(见 参考资料 中的链接)。
可应用的版本本文主要关注在 2。6。27。1 Linux 内核和 GCC 的 4。3。2 版本中使用 GCC 扩展。每个 C 扩展引用 Linux 内核源代码中的一个文件,可以在其中找到示例。
可以以几种方式对可用的 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
范围还支持更复杂的初始化。
例如,以下代码指定数组中几个子范围的初始值。int widths[] = { [0 。。。 9] = 1, [10 。。。 99] = 2, [100] = 3 };
零长度的数组
在 C 标准中,必须定义至少一个数组元素。
这个需求往往会使代码设计复杂化。但是,GCC 支持零长度数组的概念,这对于结构定义尤其有用。这个概念与 ISO C99 中灵活的数组成员相似,但是使用不同的语法。
下面的示例在结构的末尾声明一个没有成员的数组(见 。
/linux/drivers/ieee1394/raw1394-private。h)。这允许结构中的元素引用结构实例后面紧接着的内存。在需要数量可变的数组成员时,这个特性很有用。struct iso_block_store { atomic_t refcount; size_t data_size; quadlet_t data[0];};。
收起