前面讲了gcc的类型扩展属性,其实还有标签label扩展属性,枚举扩展属性等,但都不太重要,也不常用,就不讲了。今天来专门讲讲gcc的内联函数特性,使用内联函数,可以减少函数调用,加快程序运行速度。
一般新手会有个误解,认为只要使用了inline定义函数,则编译的时候,此内联函数一定会在调用它的地方被直接展开,就像宏定义似的。但其实对gcc来说是不准确的,对gcc来说,inline只是建议,具体是否展开,还要看其他因素。比如没有使用相关优化选项,则不会内联。如果使用了相关优化选项,如-finline-functions,-O等,有时gcc也会对那些简单的函数自动内联,即使那些函数并没有定义内联。
下面内联函数通常的声明方式有下面两种。
使用static来装饰inline:
static inline intinc (int *a)
使用extern声明,然后接着定义的时候使用inline:
extern int inc (int *a);inline intinc (int *a)
如果一个inline函数不是static的,其他文件也有可能调用这个函数。但是因为一个全局符号(全局变量,函数名等)在一个程序中只能定义一次,如果其他代码需要用到这个符号,则需要链接。所以这个函数还得汇编成一个函数块,好被其他模块链接,其他模块也就不能直接展开。所以,只是在一个源文件中使用的话,记得给inline函数加上static标签。
使用的简单方法是,在头文件中使用extern inline定义函数,把另一份相同没有使用extern inline的函数定义复制到库文件中。这样大部分的此函数调用都会展开了。