C++超詳細(xì)分析講解內(nèi)聯(lián)函數(shù)
宏函數(shù)(帶參數(shù)的宏)的缺點(diǎn)
第一個(gè)問題:宏函數(shù)看起來像一個(gè)函數(shù)調(diào)用,但是會(huì)有隱藏一些難以發(fā)現(xiàn)的問題。
例如:
#define FUN(x, y) (x * y)
printf("%d", add(3, 3 + 2)) //3 * 3 + 2 = 11以上情況可以通過加 “()” 解決:
#define FUN(x, y) (x * y)
printf("%d", add(3, (3 + 2))) //3 * (3 + 2) = 15特殊情況加()也保證不了參數(shù)的完整性:
#define GET_MAX_DATA(a, b) ((a)>(b)?(a):(b))
void test02()
{
int a = 3;
int b = 5;
//((a)>(++b)?(a):(++b)) 無法保證參數(shù)的完整性
printf("最大值為:%d\n", GET_MAX_DATA(a,++b));//7
}第二個(gè)問題是c++特有的,預(yù)處理器不允許訪問類的成員,即預(yù)處理器宏不能用作類的成員函數(shù)
內(nèi)聯(lián)函數(shù):內(nèi)聯(lián)函數(shù)為了繼承宏函數(shù)的效率,沒有函數(shù)調(diào)用時(shí)開銷,然后又可以像普通函數(shù)那樣,可以進(jìn)行參數(shù),返回值類型的安全檢查,又可以作為成員函數(shù)
內(nèi)聯(lián)函數(shù):是一個(gè)真正的函數(shù)。函數(shù)的替換 發(fā)生在編譯階段
inline修飾的函數(shù)就是內(nèi)聯(lián)函數(shù)
inline int myAdd(int x, int y)//inline必須出現(xiàn)在函數(shù)的定義處
{
return x+y;
}內(nèi)聯(lián)函數(shù)為了繼承宏函數(shù)的效率,沒有函數(shù)調(diào)用時(shí)開銷,然后又可以像普通函數(shù)那樣,可以進(jìn)行參數(shù), 返回值類型的安全檢查,又可以作為成員函函數(shù)。
內(nèi)聯(lián)函數(shù):是在編譯階段 完成的替換。
inline int my_mul(int x,int y)
{
return x*y;
}
void test01()
{
cout<<"my_mul = "<<my_mul(10+10,20+20)<<endl;
}任何在類內(nèi)部定義的函數(shù)自動(dòng)成為內(nèi)聯(lián)函數(shù)。
內(nèi)聯(lián)函數(shù)的特點(diǎn)
1、能保證參數(shù)的完整性
2、有作用域的限制,可以成為類的成員
3、類中的成員函數(shù) 默認(rèn)都是內(nèi)聯(lián)函數(shù)(不用inline)
內(nèi)聯(lián)函數(shù)的要求:
不能存在任何形式的循環(huán)語句 不能存在過多的條件判斷語句 函數(shù)體不能過于龐大 不能對(duì)函數(shù)進(jìn)行取地址操作。
內(nèi)聯(lián)僅僅只是給編譯器一個(gè)建議。(具體處理方式由編譯器來決定)
宏函數(shù)和內(nèi)聯(lián)函數(shù)的區(qū)別
宏函數(shù):
預(yù)處理階段完成替換、沒有出入棧的開銷、不能保證參數(shù)的完整性、沒有作用域限制、不能作為類的成員
內(nèi)聯(lián)函數(shù):
編譯階段完成替換、沒有出入棧的開銷、能保證參數(shù)的完整性、有作用域限制、能作為類的成員
到此這篇關(guān)于C++超詳細(xì)分析講解內(nèi)聯(lián)函數(shù)的文章就介紹到這了,更多相關(guān)C++內(nèi)聯(lián)函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言中進(jìn)程信號(hào)集的相關(guān)操作函數(shù)詳解
這篇文章主要介紹了C語言中進(jìn)程信號(hào)集的相關(guān)操作函數(shù)詳解,包括sigismember函數(shù)和sigfillset函數(shù)以及sigemptyset函數(shù)的用法,需要的朋友可以參考下2015-09-09
基于C語言代碼實(shí)現(xiàn)點(diǎn)餐系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于C語言代碼實(shí)現(xiàn)點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01
C++ opencv實(shí)現(xiàn)的把藍(lán)底照片轉(zhuǎn)化為白底照片功能完整示例
這篇文章主要介紹了C++ opencv實(shí)現(xiàn)的把藍(lán)底照片轉(zhuǎn)化為白底照片功能,結(jié)合完整實(shí)例形式詳細(xì)分析了C++使用opencv模塊進(jìn)行圖片轉(zhuǎn)換操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-12-12
C語言MultiByteToWideChar和WideCharToMultiByte案例詳解
這篇文章主要介紹了C語言MultiByteToWideChar和WideCharToMultiByte案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
C語言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用鏈表
這篇文章主要為大家詳細(xì)介紹了c語言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11

