文档详情

C语言inline.doc

发布:2017-07-08约2.48万字共8页下载文档
文本预览下载声明
C语言的inline C语言的inline 转以前我用Docbook写的一篇关于C语言inline关键字使用的文章。唉,要是能用docbook直接写Blog就好了。用得越多发现Docbook这个东西真是越好用啊~~ ? 本文介绍了GCC和C99标准中inline使用上的不同之处。inline属性在使用的时候,要注意以下两点: inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Declare)。 从inline的作用来看,其放置于函数声明中应当也是毫无作用的:inline只会影响函数在translation unit(可以简单理解为C源码文件)内的编译行为,只要超出了这个范围inline属性就没有任何作用了。所以inline关键字不应该出现在函数声明中,没有任何作用不说,有时还可能造成编译错误(在包含了sys/compiler.h的情况下,声明中出现inline关键字的部分通常无法编译通过); inline关键字仅仅是建议编译器做内联展开处理,而不是强制。在gcc编译器中,如果编译优化设置为-O0,即使是inline函数也不会被内联展开,除非设置了强制内联(__attribute__((always_inline)))属性。 1.?GCC的inline gcc对C语言的inline做了自己的扩展,其行为与C99标准中的inline有较大的不同。 1.1.?static inline GCC的static inline定义很容易理解:你可以把它认为是一个static的函数,加上了inline的属性。这个函数大部分表现和普通的static函数一样,只不过在调用这种函数的时候,gcc会在其调用处将其汇编码展开编译而不为这个函数生成独立的汇编码。除了以下几种情况外: 函数的地址被使用的时候。如通过函数指针对函数进行了间接调用。这种情况下就不得不为static inline函数生成独立的汇编码,否则它没有自己的地址。 其他一些无法展开的情况,比如函数本身有递归调用自身的行为等。 static inline函数和static函数一样,其定义的范围是local的,即可以在程序内有多个同名的定义(只要不位于同一个文件内即可)。 注意 gcc的static inline的表现行为和C99标准的static inline是一致的。所以这种定义可以放心使用而没有兼容性问题。 要点: gcc的static inline相对于static函数来说只是在调用时建议编译器进行内联展开; gcc不会特意为static inline函数生成独立的汇编码,除非出现了必须生成不可的情况(如通过函数指针调用和递归调用); gcc的static inline函数仅能作用于文件范围内。 1.2.?inline 相对于C99的inline来说,GCC的inline更容易理解:可以认为它是一个普通全局函数加上了inline的属性。即在其定义所在文件内,它的表现和static inline一致:在能展开的时候会被内联展开编译。但是为了能够在文件外调用它,gcc一定会为它生成一份独立的汇编码,以便在外部进行调用。即从文件外部看来,它和一个普通的extern的函数无异。举个例子: foo.c: /* 这里定义了一个inline的函数foo() */ inline foo() { ...; - 编译器会像非inline函数一样为foo()生成独立的汇编码 } void func1() { foo(); - 同文件内foo()可能被编译器内联展开编译而不是直接call上面生成的汇编码 } 而在另一个文件里调用foo()的时候,则直接call的是上面文件内生成的汇编码: bar.c: extern foo(); - 声明foo(),注意不能在声明内带inline关键字 void func2() { foo(); - 这里就是直接call在foo.c内为foo()函数生成的汇编码了 } 重要 虽然gcc的inline函数的行为很好理解,但是它和C99的inline是有很大差别的。请注意看后面对C99 inline的描述( HYPERLINK /mmm2008-02-07_16.56/sect.tips.develop.inline.html \l sect.tips.develop.inline.c99.inline \o .?inline 第?2.2?节 “inline”),以及如何以兼顾GCC和C99的方式使用inline函数。 要点: gcc的inline函数相对于普通extern函数来说只是在同一个文件内调用时建议编译器进行内联展开; gcc一
显示全部
相似文档