帶參數(shù)的宏定義的一般格式 帶參數(shù)宏定義和函數(shù)的區(qū)別?
帶參數(shù)宏定義和函數(shù)的區(qū)別?1. 當(dāng)編譯器編譯源代碼時(shí),宏將被簡(jiǎn)單地替換,沒(méi)有任何邏輯檢測(cè),即簡(jiǎn)單的代碼復(fù)制。2. 定義宏時(shí)不考慮參數(shù)類(lèi)型。3. 參數(shù)宏的使用將使具有相同功能的代碼塊在目標(biāo)文件中有多個(gè)副
帶參數(shù)宏定義和函數(shù)的區(qū)別?
1. 當(dāng)編譯器編譯源代碼時(shí),宏將被簡(jiǎn)單地替換,沒(méi)有任何邏輯檢測(cè),即簡(jiǎn)單的代碼復(fù)制。
2. 定義宏時(shí)不考慮參數(shù)類(lèi)型。
3. 參數(shù)宏的使用將使具有相同功能的代碼塊在目標(biāo)文件中有多個(gè)副本,這將增加目標(biāo)文件的大小。
4. 參數(shù)宏的運(yùn)行速度比函數(shù)快,因?yàn)椴恍枰獏?shù)棧的壓出操作。
5. 在定義參數(shù)宏時(shí),應(yīng)該更加小心,并添加更多的方括號(hào)。
6. 該函數(shù)只存在于目標(biāo)文件中的一個(gè)位置,這樣可以節(jié)省程序空間。
7. 函數(shù)的調(diào)用會(huì)涉及參數(shù)的傳遞,壓棧/出棧操作比較慢。
8. 函數(shù)的參數(shù)有傳遞值和地址(指針)的問(wèn)題,但參數(shù)宏不存在。
宏定義用法?
說(shuō)到宏定義,我們首先應(yīng)該了解什么是預(yù)處理指令。我相信你對(duì)它并不陌生。在編寫(xiě)程序之前,程序開(kāi)頭的include指令和define指令都是預(yù)處理指令,這使得我們的編譯更加高效和方便。因此,用戶可以在C語(yǔ)言中添加一些特定的預(yù)處理指令。
C語(yǔ)言提供的預(yù)處理功能有:宏定義、文件包含、條件編譯。今天,我將帶大家學(xué)習(xí)宏定義。宏定義有兩種,一種是“無(wú)參數(shù)宏定義”,另一種是“有參數(shù)宏定義”。
1、無(wú)參數(shù)宏定義
無(wú)參數(shù)宏定義相對(duì)簡(jiǎn)單,它使用指定的標(biāo)識(shí)符來(lái)表示字符串。它的一般形式是;
#define identifier string
它的功能是用這個(gè)程序文件中指定的標(biāo)識(shí)符E替換2.71828459。在預(yù)處理中,指令后的所有e都被2.7182818459替換。此方法允許用戶用簡(jiǎn)單名稱替換長(zhǎng)字符串,因此此標(biāo)識(shí)符(名稱)稱為“宏名稱”
在預(yù)處理期間用字符串替換宏名稱的過(guò)程稱為“宏擴(kuò)展”。#Define是宏定義指令。
2、帶參數(shù)宏定義
帶參數(shù)宏定義不僅是一個(gè)簡(jiǎn)單的字符串替換,也是一個(gè)參數(shù)替換。其定義的一般形式是;
#define identifier(macro name)(parameter table)string
該字符串包含括號(hào)中指定的參數(shù)。
宏定義只占用編譯時(shí)間,而函數(shù)調(diào)用占用運(yùn)行時(shí)間(分配單元、保存字段、值傳輸、返回)。每次執(zhí)行都必須加載,因此執(zhí)行速度比宏定義慢。
當(dāng)宏定義被多次使用時(shí),源程序在宏定義展開(kāi)后會(huì)很長(zhǎng)時(shí)間,因?yàn)槊看握归_(kāi)都會(huì)使程序增長(zhǎng),但執(zhí)行速度更快(這不是絕對(duì)的)。當(dāng)宏定義擴(kuò)展較多時(shí),目標(biāo)文件很大,執(zhí)行過(guò)程中系統(tǒng)頻繁換頁(yè),效率較低)。函數(shù)調(diào)用不會(huì)使源程序變長(zhǎng)。