欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

6-3 宏定義 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設/小程序開發(fā)/軟件開發(fā)

知識

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!

您當前位置>首頁 » 新聞資訊 » 技術分享 >

6-3 宏定義

發(fā)表時間:2020-10-19

發(fā)布人:葵宇科技

瀏覽次數(shù):64

6.3.1 宏定義的規(guī)則和使用解析

(1)宏定義的解析規(guī)則就是:在預處理階段由預處理器來進行替換,這個替換是原封不動的替換。
(2)宏定義替換會遞歸進行,直到替換出來的值本身不再是一個宏為止。
(3)一個正確的宏定義式子本身分為3部分:第一部分是#define,第二部分是宏名,剩下的為第三部分。
(4)宏可以帶參數(shù),稱為帶參宏。帶參宏的使用和帶參函數(shù)非常像,但是使用上有一些差異。在定義帶參宏時,每一個參數(shù)在宏體中引用時都必須加括號,最后整體再加括號,括號缺一不可。

#include <stdio.h> 
#define  X(a,b)		((a)+(b)) 
int main()
{	
	int a = 1,b = 2;	
	int c =3 * X(a,b);	
	printf("c = %d\n",c);	
	return 0;
}

6.3.2 宏定義示例1:MAX,求2個數(shù)中較大的一個

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

關鍵:
第一點:要想到使用三目運算符來完成。
第二點:注意括號的使用。

6.3.3 宏定義示例2:SEC_PER_YEAR,用宏定義表示一年有多少秒

#define  SEC_PER_YEAR	(365*24*60*60UL)

關鍵:
第一點:當一個數(shù)字直接出現(xiàn)在程序中時,它的類型默認是int;
第二點:一年有多少秒,這個數(shù)字剛好超過了int類型存儲的范圍

6.3.4 帶參宏和帶參函數(shù)的區(qū)別(宏定義的缺陷)

(1)宏定義是在預處理期間處理的,而函數(shù)是在編譯期間處理的。這個區(qū)別帶來的實質(zhì)差異是:宏定義最終是在調(diào)用宏的地方把宏體原地展開,而函數(shù)是在調(diào)用函數(shù)處跳轉(zhuǎn)到函數(shù)中去執(zhí)行,執(zhí)行完后再跳轉(zhuǎn)回來。
注意:宏定義和函數(shù)的最大差別就是:宏定義是原地展開,因此沒有調(diào)用開銷;而函數(shù)是跳轉(zhuǎn)執(zhí)行再返回,因此函數(shù)有比較大的調(diào)用開銷。所以宏定義和函數(shù)相比,優(yōu)勢就是沒有調(diào)用開銷,沒有傳參開銷,所以當函數(shù)體很短(尤其是只有一句話時)可以用宏定義來替代,這樣效率比較高。
(2)帶參宏和帶參函數(shù)的一個重要差別就是:宏定義不會檢查參數(shù)的類型,返回值也不會附帶類型;而函數(shù)有明確的參數(shù)類型和返回值類型。當我們調(diào)用函數(shù)時編譯器會幫我們做參數(shù)的靜態(tài)類型檢查,如果編譯器發(fā)現(xiàn)我們實際傳參和參數(shù)聲明不同時會報警告或錯誤。
注意:用函數(shù)的時候程序員不太用操心類型不匹配,因為編譯器會檢查,如果不匹配編譯器會叫;用宏的時候程序員必須很注意實際傳參和宏所希望的參數(shù)類型一致,否則可能編譯不報錯但是運行有誤。
總結(jié):宏和函數(shù)各有千秋,各有優(yōu)劣??偟膩碚f,如果代碼比較多用函數(shù)適合而且不影響效率;但是對于那些只有一兩句話的函數(shù)開銷就太大了,適合用帶參宏。但是用帶參宏又有缺點:不檢查參數(shù)類型。

6.3.5 內(nèi)聯(lián)函數(shù)和inline關鍵字

(1)內(nèi)聯(lián)函數(shù)通過在函數(shù)定義前加inline關鍵字實現(xiàn)。
(2)內(nèi)聯(lián)函數(shù)本質(zhì)上是函數(shù),所以有函數(shù)的優(yōu)點(內(nèi)聯(lián)函數(shù)是編譯器負責處理的,編譯器可以幫我們做參數(shù)的靜態(tài)類型檢查);但是它同時也有帶參宏的優(yōu)點(不用調(diào)用開銷,而是原地展開)。所以幾乎可以這樣認為:內(nèi)聯(lián)函數(shù)就是帶了參數(shù)靜態(tài)類型檢查的宏。
(3)當我們的函數(shù)內(nèi)函數(shù)體很短(譬如只有一兩句話)的時候,我們又希望利用編譯器的參數(shù)類型檢查來排錯,我還希望沒有調(diào)用開銷時,最適合用內(nèi)聯(lián)函數(shù)。

6.3.6 宏定義來實現(xiàn)條件編譯(#define #undef #ifdef)

(1)程序有DEBUG和RELEASE版本,區(qū)別就是編譯時有無定義DEBUG宏。

#include <stdio.h>
//這兩行代碼的效果加在一起就相當于沒有定義DEBUG
//注銷一個宏。如果前面有定義這個宏則取消這個宏,如果沒有就無視掉
#define  DEBUG
#undef 	DEBUG 

#ifdef  DEBUG
#define	debug(x)	printf(x)
#else
#define   debug(x)
#endif 
int main(void)
{	
	debug("this is a debug info\n");	
	return 0;
}

相關案例查看更多