引言:調用函數時,通常會因為建立調用、傳遞參數、跳轉到函數代碼并返回等花費掉一些時間,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變量
- (二四)內存分配