有沒有專做泰國代購的網(wǎng)站qq推廣工具
文章目錄
- 函數(shù)參數(shù)缺省
- 函數(shù)參數(shù)缺省的條件和要求
- 內(nèi)聯(lián)函數(shù)
- 內(nèi)聯(lián)函數(shù)的工作原理
- 內(nèi)聯(lián)函數(shù)的定義方法
- 內(nèi)聯(lián)函數(shù)的要求
- 解決方法:直接在.h中定義內(nèi)聯(lián)函數(shù)的函數(shù)體
- 內(nèi)聯(lián)函數(shù)再Debug模式下默認(rèn)是不展開的
函數(shù)參數(shù)缺省
顧名思義:可以少傳一個(gè)/多個(gè)參數(shù)給函數(shù),但是該函數(shù)還能正常運(yùn)行
例
不像C語言中函數(shù)定義了幾個(gè)參數(shù)就必須傳幾個(gè)參數(shù)函數(shù)才能工作
函數(shù)參數(shù)缺省的條件和要求
-
必須
在聲明或者定義時(shí)給形參一個(gè)默認(rèn)值
如
這樣函數(shù)在參數(shù)缺省的時(shí)候就可以用形參的默認(rèn)值工作,再有參數(shù)傳入時(shí),從左往右
把默認(rèn)值覆蓋 -
給函數(shù)的形參默認(rèn)值時(shí)
必須從右往左
給【即右邊的有默認(rèn)值了,才能給左邊的形參默認(rèn)值】
例
這樣可以
但是這樣不行
為什么呢?
因?yàn)楹瘮?shù)形參接收參數(shù)是從左往右接收
的,所以左邊的形參先接收到參數(shù),如果少傳了參數(shù),參數(shù)就會被左邊的形參數(shù)接收完畢,此時(shí)如果右邊的形參沒有默認(rèn)值,函數(shù)就工作不了了 -
給函數(shù)默認(rèn)值時(shí)
不能
跳著給
-
函數(shù)給默認(rèn)值時(shí),如果
函數(shù)有聲明就必須在聲明時(shí)給默認(rèn)值
,定義時(shí)不能再給
例
內(nèi)聯(lián)函數(shù)
內(nèi)聯(lián)函數(shù)是用空間換取時(shí)間的函數(shù)
注意:內(nèi)聯(lián)函數(shù)是程序員對編譯器的建議
如果程序員設(shè)定的內(nèi)聯(lián)函數(shù)的函數(shù)體太長,編譯器就可能不會將它作為內(nèi)聯(lián)函數(shù),還是將它視為普通函數(shù)
內(nèi)聯(lián)函數(shù)的工作原理
①把函數(shù)實(shí)現(xiàn)放在代碼區(qū),不放在棧區(qū)
(即把函數(shù)的函數(shù)體展開在代碼里,有點(diǎn)類似宏函數(shù)的展開)
②把函數(shù)時(shí)間放在了代碼區(qū),就不用傳參
去掉了傳參的時(shí)間。
也省去了操作系統(tǒng)給棧區(qū)函數(shù)的形參分配值的時(shí)間。
③不放在棧區(qū)實(shí)現(xiàn),操作系統(tǒng)就不用銷毀回收空間,去掉了操作系統(tǒng)回收空間的時(shí)間。
內(nèi)聯(lián)函數(shù)的定義方法
直接在函數(shù)定義//聲明的返回值前+一個(gè)關(guān)鍵字inline
即可
例
內(nèi)聯(lián)函數(shù)的調(diào)用方法和普通函數(shù)一樣
內(nèi)聯(lián)函數(shù)的要求
函數(shù)體
不能太長,代碼不能太多
為什么?
假設(shè)一個(gè)內(nèi)聯(lián)函數(shù)的函數(shù)體為100行代碼
它會被調(diào)用100000次,每一次調(diào)用都會展開一次函數(shù)體到代碼區(qū)去
那么它就會在代碼區(qū)展開出100000*100
行代碼,會有很多重復(fù)的代碼
而且這些代碼都會被存在最終的可執(zhí)行程序中
,導(dǎo)致可執(zhí)行程序的大小變大
而此時(shí)如果不用內(nèi)聯(lián),那存入可執(zhí)行程序的代碼
就只有100000+100
行代碼
其中100000行代碼都是調(diào)用該函數(shù)的代碼,100行代碼是該函數(shù)的函數(shù)體
因?yàn)槠胀ê瘮?shù)的函數(shù)體在棧中,每次調(diào)用時(shí)都會開辟棧區(qū)空間,再棧區(qū)空間中執(zhí)行函數(shù)體,每次調(diào)用函數(shù)都是重復(fù)使用那函數(shù)的100代碼
函數(shù)體里面不能有遞歸調(diào)用
因?yàn)?mark>內(nèi)聯(lián)函數(shù)每次調(diào)用都要在調(diào)用位置展開內(nèi)聯(lián)函數(shù)的函數(shù)體
而編譯器
不知道遞歸什么時(shí)候能結(jié)束,就不知道會展開多少次,所以編譯器不會接受把遞歸函數(shù)做內(nèi)聯(lián)函數(shù)
內(nèi)聯(lián)函數(shù)聲明和定義不能分離在不同文件中
【在同一文件中可以】
例
普通函數(shù)是可以分離的
內(nèi)聯(lián)函數(shù)不能分離
為什么呢?
因?yàn)閮?nèi)聯(lián)函數(shù)是不進(jìn)編譯鏈接時(shí)的符號表的,也沒有地址
所以鏈接時(shí)找不到
解決方法:直接在.h中定義內(nèi)聯(lián)函數(shù)的函數(shù)體
因?yàn)楸话念^文件會在預(yù)處理時(shí)展開,所以包含了頭文件的文件就內(nèi)使用該頭文件中定義的東西
(不了解編譯和鏈接的可以看我這篇文章:c語言編譯和鏈接)
例
內(nèi)聯(lián)函數(shù)再Debug模式下默認(rèn)是不展開的
因?yàn)檎归_了就和宏一樣不方便調(diào)試