1. 程式人生 > >【C++】行內函數和巨集的區別

【C++】行內函數和巨集的區別

行內函數

行內函數指的是用[ inline ]關鍵字修飾的函式,在類體內定義的函式會被預設定義為行內函數

特性

行內函數會在【編譯】期間進行替換,就是將呼叫該函式的地方換成【函式體】(類似於C語言中的巨集,然而巨集是在【預處理】階段進行替換)

行內函數和巨集的不同之處

1、型別檢測

我們先定義一個MAX巨集

#include<stdio.h>
#include<stdlib.h>

#define MAX(a,b) (a>b)?a:b

int main()
{	
	int a = 10;
	int b = 20;
	int ret = MAX(a,b);
	printf("ret = %d\n",ret);
	system("pause");
	return 0;
}
上面便定義了一個MAX的巨集,可以求a和b的大小

然而,利用巨集是有問題

#define MAX(a,b) (a>b)?a:b

int main()
{	
	int a = 10;
	int b = 20;
	int ret = MAX(a++,b);
	printf("ret = %d\n",ret);
	system("pause");
	return 0;
}
如果用MAX(a++,b)

則這個是含有副作用的

#define MAX(a,b) (a>b)?a:b

int main()
{	
	int a = 10;
	int b = 20;
	int ret = MAX(a++,b);//利用巨集,a的值會被修改
	printf("ret = %d\n",ret);
	system("pause");
	return 0;
}
上例便說明了巨集傳入含有【副作用引數】便會有影響

行內函數便很好的解決了這個問題

行內函數是畢竟是【函式】,有【引數型別】的判斷。

2、替換時機不同

行內函數在【編譯】的時候替換

巨集在【預處理】階段進行替換

3、替換的成功率

巨集一旦定義則在【預處理】階段一定會替換

行內函數僅僅是對【編譯器】的一個建議

如果編譯器覺得該函式不適合成為行內函數時,便會忽略前面的[ inline ]關鍵字

比如當我們將一個【遞迴】函式,如果編譯器不進行檢測,那麼檔案就會無限的擴大下去

此時,【編譯器】便會忽略[ inline ]關鍵字

總結

總的來說,【行內函數】是消除【函式呼叫】時的開銷。

和巨集類似,一個小的函式宣告成【行內函數】

可以非常受益。

並且避免了巨集傳【副作用引數】的所造成的錯誤。

不管自己定義行內函數與否,【編譯器】會根據自己的判斷來決定是否內聯