一般的宏嵌套展開(kāi)規(guī)則是由內(nèi)向外,先將內(nèi)層宏展開(kāi),再把外層宏展開(kāi):
#include #define A(x) (x + 5)#define B(x) (x * 5)void main(void){ printf(“%dr”, B(A(2)));}
輸出:
35
嵌套宏B(A(2))會(huì)先展開(kāi)為B((2 + 5)),然后再展開(kāi)為((2 + 5) * 5),所以最終結(jié)果為35
如果宏的參數(shù)直接帶有#,則不會(huì)展開(kāi)內(nèi)層的嵌套宏
#include #define STR(x) #x#define TO_STR(x) STR(x)#define ADD(a, b) (a + b)void main(void){ printf(“%sr”, STR(ADD(3, 4))); printf(“%sr”, TO_STR(ADD(3, 4)));}
輸出:
ADD(3, 4)(3 + 4)
因?yàn)镾TR宏的參數(shù)直接帶有#,所以STR內(nèi)部嵌套的內(nèi)容不會(huì)被進(jìn)一步展開(kāi),故STR(ADD(3, 4))輸出為ADD(3, 4);
因?yàn)門(mén)O_STR宏的內(nèi)容并沒(méi)有#,所以嵌套的宏ADD(3, 4)依舊可以展開(kāi),故TO_STR(ADD(3, 4))輸出結(jié)果為(3 + 4);
如果宏的參數(shù)直接帶有##,則會(huì)先將參數(shù)通過(guò)##拼接,然后再依次進(jìn)行展開(kāi)
#include #define STR(x)#x#define TO_STR(x)STR(x)#define DEF_VAR(a)var_##a#define PARAM(x)param_##xvoid main(void){ printf(“%sr”, TO_STR(DEF_VAR(PARAM(10))));}
輸出:
var_PARAM(10)
由于DEF_VAR中帶有##所以會(huì)先將里面的內(nèi)容使用##拼接,所以會(huì)最先展開(kāi)為T(mén)O_STR(var_PARAM(10)),由于展開(kāi)后PARAM(10)已經(jīng)變成了var_PARAM(10),已經(jīng)不是有效的宏了,所以最終再經(jīng)過(guò)TO_STR的轉(zhuǎn)換后,結(jié)果就是var_PARAM(10)