宏定義又稱為宏代換、宏替換,簡(jiǎn)稱"宏"。
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括堆龍德慶網(wǎng)站建設(shè)、堆龍德慶網(wǎng)站制作、堆龍德慶網(wǎng)頁(yè)制作以及堆龍德慶網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,堆龍德慶網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到堆龍德慶省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
格式:
#define 標(biāo)識(shí)符 字符串
其中的標(biāo)識(shí)符就是所謂的符號(hào)常量,也稱為"宏名"。
預(yù)處理(預(yù)編譯)工作也叫做宏展開(kāi):將宏名替換為字符串。
掌握"宏"概念的關(guān)鍵是"換"。一切以換為前提、做任何事情之前先要換,準(zhǔn)確理解之前就要"換"。
即在對(duì)相關(guān)命令或語(yǔ)句的含義和功能作具體分析之前就要換:
例:
#define Pi 3.1415926
把程序中出現(xiàn)的Pi全部換成3.1415926
那個(gè)是分號(hào),不是冒號(hào)。這個(gè)分號(hào)的作用就是函數(shù)調(diào)用語(yǔ)句末尾的分號(hào)
例如LED_BLUE宏展開(kāi)后為digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN);digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN);digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)
你只需要使用“LED_BLUE;”語(yǔ)句就可以關(guān)閉LED1和2,打開(kāi)LED3。
宏定義可以執(zhí)行多條函數(shù),宏定義的本質(zhì)實(shí)際上是文本替換,把宏定義的內(nèi)容原原本本地替換到宏使用的地方。
另外,LED2_OFF后面似乎也應(yīng)該有個(gè)分號(hào),否則編譯應(yīng)該會(huì)出錯(cuò)的。除非LED2_OFF宏定義里加了分號(hào)。
宏定義就好像是WORD中的“全部替換”一樣,只不過(guò)這個(gè)替換是在將源程序在系統(tǒng)“編譯”時(shí)執(zhí)行的。
舉例說(shuō):
#define sub(a,b) ((a)-(b))
源程序中若有
x=sub(200-1,100+10);
會(huì)被編譯為:
x=((200-1)-(100+10));
即x被賦值為89
如果#define sub(a,b) a-b的話
x=sub(200-1,100+10);
就變成x=200-1-100+10;
x會(huì)被賦值為109
(一)宏定義中的##
連接符與#
符
##
連接符號(hào)由兩個(gè)井號(hào)組成,其功能是在帶參數(shù)的宏定義中將兩個(gè)子串(token)聯(lián)接起來(lái),從而形成一個(gè)新的子串。但它不可以是第一個(gè)或者最后一個(gè)子串。所謂的子串(token)就是指編譯器能夠識(shí)別的最小語(yǔ)法單元。具體的定義在編譯原理里有詳盡的解釋,但不知道也無(wú)所謂。同時(shí)值得注意的是#符是把傳遞過(guò)來(lái)的參數(shù)當(dāng)成字符串進(jìn)行替代。下面來(lái)看看它們是怎樣工作的。這是msdn上的一個(gè)例子。
假設(shè)程序中已經(jīng)定義了這樣一個(gè)帶參數(shù)的宏:
#define
paster(
n
)
printf(
"token"
#n
"
=
%d",
token##n
)
同時(shí)又定義了一個(gè)整形變量:
int
token9
=
9;
現(xiàn)在在主程序中以下面的方式調(diào)用這個(gè)宏:
paster(
9
);
那么在編譯時(shí),上面的這句話被擴(kuò)展為:
printf(
"token"
"9"
"
=
%d",
token9
);
注意到在這個(gè)例子中,paster(9);中的這個(gè)”9”被原封不動(dòng)的當(dāng)成了一個(gè)字符串,與”token”連接在了一起,從而成為了token9。而#n也被”9”所替代。
可想而知,上面程序運(yùn)行的結(jié)果就是在屏幕上打印出token9=9
(二)"\"與一個(gè)較長(zhǎng)占多行的宏
宏定義中允許包含兩行以上命令的情形,此時(shí)必須在最右邊加上"\"且該行"\"后不能再有任何字符,連注釋部分都不能有,下面的每行最后的一定要是"\","\"后面加一個(gè)空格都會(huì)報(bào)錯(cuò),更不能跟注釋。
#define
exchange(a,b)
{\
int
t;\
t=a;\
a=b;\
b=t;\
}
主要用于函數(shù)重定義,通用性,可以用一個(gè)變量符號(hào)替代另一個(gè)變量符號(hào)
格式:#define M(x,y) x+y
在主程序里寫(xiě)入z=M(6,9);等價(jià)于z=6+9;而寫(xiě)成z=(6-8,9);等價(jià)于z=6-8+9 ;直接代入
還有就是 :#define Uint unsigned int 即用 Uint 代替unsigned int 便于書(shū)寫(xiě),還有就是不同操作系統(tǒng)的通用變量識(shí)別
C語(yǔ)言中的宏定義用法分為兩種。
1、不帶參數(shù)的宏定義比較簡(jiǎn)單,就是用一個(gè)指定的標(biāo)識(shí)符來(lái)代表一個(gè)字符串。它的一般形式為“#define 標(biāo)識(shí)符 字符串”,例如#define E 2.718281828459。這種方法使用戶能以一個(gè)簡(jiǎn)單的名字代替一個(gè)長(zhǎng)的字符串。
2、帶參數(shù)的宏定義不是僅僅進(jìn)行簡(jiǎn)單的字符串替換,還要進(jìn)行參數(shù)替換。其定義的一般形式為;“#define 標(biāo)識(shí)符(宏名)(參數(shù)表) 字符串”,字符串中包含在括號(hào)中所指定的參數(shù)。例如#define S(a,b) a*b area=S(3. 2)。
擴(kuò)展資料:
宏定義只占編譯時(shí)間,函數(shù)調(diào)用則占用運(yùn)行時(shí)間(分配單元,保存現(xiàn)場(chǎng),值傳遞,返回),每次執(zhí)行都要載入,所以執(zhí)行相對(duì)宏定義會(huì)較慢。
使用宏定義次數(shù)多時(shí),宏定義展開(kāi)后源程序很長(zhǎng),因?yàn)槊空归_(kāi)一次都使程序增長(zhǎng),但是執(zhí)行起來(lái)比較快一點(diǎn)(這也不是絕對(duì)的,當(dāng)有很多宏定義展開(kāi),目標(biāo)文件很大,執(zhí)行的時(shí)候運(yùn)行時(shí)系統(tǒng)換頁(yè)頻繁,效率就會(huì)低下)。而函數(shù)調(diào)用不使源程序變長(zhǎng)。