簡單宏容易理解,如:
#define PI 3.14
帶參數的宏以及宏嵌套:
#define FIRST_IMG_ADDR 0x9f600000
#define _BOOTCMD(addr) "bootm "#addr
#define BOOTCMD(addr) _BOOTCMD(addr)
BOOTCMD(FIRST_IMG_ADDR)
使用BOOTCMD
時就像函數一樣使用,方便。如上語句BOOTCMD(FIRST_IMG_ADDR)
,如果要修改啟動地址時,只需要修改FIRST_IMG_ADDR
的定義即可。
上面代碼第二行中的#
號的功能是將其后面的宏參數進行字符串化操作(Stringfication),簡單說就是在對它所引用的宏變量通過替換后在其左右各加上一個雙引號.
對于##
號,則被稱為連接符(concatenator),用來將兩個Token連接為一個Token。
下面來看看它們是怎樣工作的。這是MSDN上的一個例子。假設程序中已經定義了這樣一個帶參數的宏:
#define paster( n ) printf( "token" #n " = %d", token##n )
同時又定義了一個整形變量: int token9 = 9;
現在在主程序中以下面的方式調用這個宏: paster( 9 );
那么在編譯時,上面的這句話被擴展為: printf( "token" "9" " = %d", token9 );
注意到在這個例子中,paster(9);
中的這個”9”
被原封不動的當成了一個字符串,與”token”
連接在了一起,從而成為了token9
。而#n
也被”9”
所替代可想而知,上面程序運行的結果就是在屏幕上打印出token9=9
。