标准规定具有内部链接的函数可以成为内联函数,还规定了内联函数的定义以调用改函数的代码必须在同一个文件中。因此,最简单的方法是使用函数说明符inline和存储类别说明符static。通常,内联函数应定义在首次使用它的文件中,所以内联函数也相当于函数原型。
#include <stdio.h>
inline static void eatline() //内联函数定义/原型
{
while (getchar() !='\n')
continue;
}
int main()
{
...
eatline(); //函数调用
...
}
编译器查看内联函数的定义(也是原型),可能会用函数体中的代码替换eatline()函数调用。也就是说,效果相当于在函数调用的位置输入函数体中的代码:
#include <stdio.h>
inline static void eatline() //内联函数定义/原型
{
while (getchar() !='\n')
continue;
}
int main()
{
...
while (getchar() !='\n') //替换函数调用
continue;
...
}
由于并未给内联函数预留单独的代码块,所以无法获得内联函数的地址。另外,内联函数无法在调试器中显示。
inline使用限制
inline 的使用是有所限制的,inline 只适合涵数体内代码简单的涵数使用,不能包含复杂的结构控制语句例如 while、switch,并且不能内联函数本身不能是直接递归函数(即,自己内部还调用自己的函数)。
inline 函数仅仅是一个对编译器的建议,所以最后能否真正内联,看编译器的意思,它如果认为函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联,声明内联只是一个建议而已。
其次,因为内联函数要在调用点展开,所以编译器必须随处可见内联函数的定义,要不然就成了非内联函数的调用了。所以,这要求每个调用了内联函数的文件都出现了该内联函数的定义。
因此,将内联函数的定义放在头文件里实现是合适的,省却你为每个文件实现一次的麻烦。
声明跟定义要一致:如果在每个文件里都实现一次该内联函数的话,那么,最好保证每个定义都是一样的,否则,将会引起未定义的行为。如果不是每个文件里的定义都一样,那么,编译器展开的是哪一个,那要看具体的编译器而定。所以,最好将内联函数定义放在头文件中。