引言:调用函数时,通常会因为建立调用、传递参数、跳转到函数代码并返回等花费掉一些时间,C语言的解决办法是使用类函数宏。在C99中,还提出了另外一种方法:内联函数。
内联函数:把函数变为内联函数将建议编译器尽可能快速地调用该函数,至于建议的效果则由实现来定义。因此,使函数变为内联函数可能会简化函数的调用机制,但也可能不起作用。内联函数是通过编译器来实现的,而宏则是在预编译的时候替换。
**创建内联函数方法:在函数声明中使用函数说明符inline。**
**内联函数的特点:**
1、类似于宏,编译器在看到内联函数声明时,就会在使用内联函数时用函数体代替函数调用,其效果就如同在此处键入了函数体的代码。如:
**源码:**
~~~
#include <stdio.h>
inline void eatline() //内联函数的定义
{
while(getchar() != '\n')
continue;
}
int main()
{
eatline(); //函数调用
}
~~~
**通过编译器编译其实的效果如下:**
~~~
#include <stdio.h>
inline void eatline() //内联函数的定义
{
while(getchar() != '\n')
continue;
}
int main()
{
while(getchar() != '\n')
continue;
}
~~~
2、内联函数没有预留给它的单独代码块,所以无法获得内联函数的地址。
3、内联函数不会在调试器中显示。比如上面的函数即使使用了gcc -g 选项进行了编译,通过gdb调试时,也不会有eatline函数。
4、内联函数应该是比较短小。对于很长的函数,调用函数的时间少于执行函数主体的时间;此时,使用内联函数不会节省多少时间。
5、内联函数的定义和对该函数的调用必须在同一文件中,即内联函数具有内部链接。在多个文件程序中,每个调用内联函数的文件都要对该函数进行定义。达到这个目标的简单方法为:在头文件中定义内联函数,并在使用该函数的文件中包含该头文件。
6、与C++不同,C允许混合使用内联函数定义和外部函数定义。因为定义的内联函数只能在本文件中使用,而定义的外部函数,却可以通过extern进行外部声明,在其他文件中使用。如:
~~~
//file1.c
inline double square(double);
double square (double x) { return x * x; }
//file2.c
extern double square(double);
double square (double x) { return x * x; }
//file3.c
extern double square(double);
int main()
{
double kw = square(w);
}
~~~
其中file1.c中使用的double函数时本文件中定义的内联函数,而在file2.c和file3.c中使用的double函数确实file2.c中定义的外部函数。
- 前言
- (四)回调函数
- (一)while(1)死循环与for(;;)死循环的区别
- (二)static关键字
- (三)函数
- (四)可变参数函数
- (五)setjmp和longjmp
- (六)指针
- (七)回调函数
- (八)字符串
- (九)动态内存分配
- (十)结构体
- (十一)深入理解指针
- (十二)命令行参数
- (十三)printf、fprintf、sprintf和snprintf函数
- (十四)const关键字详解
- (十五)字符串输入函数fgets、gets和scanf
- (十六)字符串输出函数puts、fputs和printf
- (十七)字符/字符串输出函数fputc、fputs、putc、putchar和puts
- (十八)字符/字符串输入函数fgetc、fgets、getc、getchar和gets
- (十九)restrict关键词
- (二十)scanf函数详解
- (二一)内联函数
- (二二)位操作
- (二三)errno变量
- (二四)内存分配