宏、參數(shù)宏、宏嵌套

簡(jiǎn)單宏容易理解,如:

#define PI 3.14

帶參數(shù)的宏以及宏嵌套

#define FIRST_IMG_ADDR 0x9f600000
#define _BOOTCMD(addr) "bootm "#addr
#define BOOTCMD(addr) _BOOTCMD(addr)

BOOTCMD(FIRST_IMG_ADDR)

使用BOOTCMD時(shí)就像函數(shù)一樣使用,方便。如上語(yǔ)句BOOTCMD(FIRST_IMG_ADDR),如果要修改啟動(dòng)地址時(shí),只需要修改FIRST_IMG_ADDR的定義即可。

上面代碼第二行中的#號(hào)的功能是將其后面的宏參數(shù)進(jìn)行字符串化操作(Stringfication),簡(jiǎn)單說(shuō)就是在對(duì)它所引用的宏變量通過(guò)替換后在其左右各加上一個(gè)雙引號(hào).
對(duì)于##號(hào),則被稱為連接符(concatenator),用來(lái)將兩個(gè)Token連接為一個(gè)Token。

下面來(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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容