簡(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。