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ù)體不能過于龐大 不能對函數(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)現(xiàn)可增容動(dòng)態(tài)通訊錄詳細(xì)過程
這篇文章主要為大家介紹了C語言實(shí)現(xiàn)簡易通訊錄的完整流程,此通訊錄還可以增容,并且每個(gè)環(huán)節(jié)都有完整代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-05-05C語言實(shí)現(xiàn)數(shù)組的循環(huán)左移,右移,翻轉(zhuǎn)的示例
今天小編就為大家分享一篇C語言實(shí)現(xiàn)數(shù)組的循環(huán)左移,右移,翻轉(zhuǎn)的示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07c語言讀取obj文件轉(zhuǎn)換數(shù)據(jù)的小例子
c語言讀取obj文件轉(zhuǎn)換數(shù)據(jù)的小例子,需要的朋友可以參考一下2013-03-03C++實(shí)現(xiàn)鼠標(biāo)控制的黑框象棋
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)鼠標(biāo)控制的黑框象棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05C++中Socket網(wǎng)絡(luò)編程實(shí)例詳解
這篇文章主要介紹了C++中Socket網(wǎng)絡(luò)編程實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04C語言編程中常見的五種錯(cuò)誤及對應(yīng)解決方案
這篇文章主要給大家分享的是C語言編程中常見的五種錯(cuò)誤及對應(yīng)解決方案,詳細(xì)內(nèi)容就請跟小編一起進(jìn)入下面的文章內(nèi)容吧2021-10-10