宏在C/C++程序中使用的非常之多,是代碼自動化生成的利器,但在跟蹤調(diào)試時宏卻又成了負(fù)擔(dān),宏展開的代碼很多時候都出人意料。把展開后的宏輸出,是分析宏的好方法。
下面先介紹宏的“#”操作符
define MACRO_(x) #x
這個MACRO_宏就是把參數(shù)x轉(zhuǎn)化為字符串,看下面的例子
1 #define MACRO_(x) #x
2 int main(int argc ,char* argv[] )
3 {
4 printf("%s",MACRO_(printf));
5 return 0;
6 }
輸出:
printf
如果參數(shù)x是個宏呢,那么輸出的會是什么呢,是宏的名字還是展開后的宏代碼
1 #define MACRO_(x) #x
2 #define HELLO "Hello World"
3 int main(int argc ,char* argv[] )
4 {
5 printf("%s",MACRO_(HELLO));
6 return 0;
7 }
上面這段代碼是輸出:HELLO,還是Hello World呢?
如果是Hello World那么我們的目的也就達(dá)到了,輸出了展開后的宏代碼
但事與愿違,上面代碼輸出的是HELLO,因為#操作符會把后面的參數(shù)強(qiáng)制轉(zhuǎn)為字符串,遇到宏是不會展開的。
這個方法失敗,既然#可以把它后面的參數(shù)變?yōu)樽址敲次覀儽仨毐WC在宏遇到#操作符之前就是展開的。這樣我們還需要定義一個輔助的宏,用來用來讓參數(shù)宏展開。
1 #define MACRO_(x) #x
2 #define HELLO "Hello World"
3 #define SHOWMACOR(mac) MACRO_(mac)
4 int main(int argc ,char* argv[] )
5 {
6 printf("%s\n",SHOWMACOR(HELLO));
7 return 0;
8 }
這樣輸出的就是展開后的:"Hello World"了
我們來分析SHOWMACOR展開的過程
第一步變?yōu)椋篗ACRO_(HELLO)
上面的表達(dá)式中沒有出現(xiàn)#,那么先是括號中的HELLO展開
第二步變?yōu)?MACRO_("Hello World")
最后MACRO_展開變?yōu)椋?"Hello World"
所以輸出為:"Hello World"
posted on 2008-04-08 13:58
。。。。 閱讀(3658)
評論(5) 編輯 收藏 引用 所屬分類:
c++