版权声明:本文为博主原创文章,未经博主允许不得转载。
1 inline只是个编译器建议,编译器不一定非得展开Inline函数。
例如:
Inline函数地址引用
inline在递归函数中使用
2 inline必须用于函数定义,对于函数声明,inline不起作用
例如:
inline max(int,int); //没有Inline作用
只有 inline max(int a,int b)
{
......
}
才有用。
3 inline定义的函数 和 宏定义一样,只在本地文件可见。所以建议Inline定义的函数放在头文件中
4 gcc中的Inline函数法则
1. static inline --->编译器本地展开。
2. inline--->本地展开,外地为Inline函数生成独立的汇编代码
3. extern inline--->不会生成独立的汇编代码。
特性1.即使是通过指针应用或者是递归调用也不会让编译器为它生成汇编码,在这种时候对此函数的调用会被处理成一个外部引用
特性2.extern inline的函数允许和外部函数重名,即在存在一个外部定义的全局库函数的情况下,再定义一个同名的extern inline函数也是合法的。
extern inline的用处:
在一个库函数的c文件内,定义一个普通版本的库函数foo:
mylib.c:
void foo()
{
...;
}
然后再在其头文件内,定义(注意不是声明!)一个实现相同的exterin inline的版本:
mylib.h:
extern inline foo()
{
...;
}
那么在别的文件要使用这个库函数的时候,只要include了mylib.h,在能内联展开的地方,编译器都会使用头文件内extern inline的版本来展开。
而在无法展开的时候(函数指针引用等情况),编译器就会引用mylib.c中的那个独立编译的普通版本。
即看起来似乎是个可以在外部被内联的函数一样,所以这应该是gcc的extern inline意义的由来。