??? 看《xxx的自我修養(yǎng)》里面有一段關(guān)于“變長參數(shù)宏”的代碼:
#include?<stdio.h>
#define?printf(args
)?fprintf(stdout,?##args)
int?main()
{
????????printf("\n%d,?%s\n",?0,?"test");
????????return?0;
} ??? 代碼不長,編譯也未見問題,結(jié)果也正常,演示了其想說明的部分。根據(jù)其意,‘##’宏用于字符串的連接操作,即將參數(shù)‘a(chǎn)rgs’部分連接成一個字符串傳給fprintf函數(shù)。但我認(rèn)為宏定義本身就是‘字符串的替換’,完全不需要‘##’,即,傳人的‘a(chǎn)rgs’是什么,fprintf被傳人的也是什么,不會有任何變化,也無需作任何操作,因此我修改宏如下:
#define?printf(args?
)?fprintf(stdout,?args) ??? 嗯,我獲得了相同的正常結(jié)果。
?? 從結(jié)果看,我認(rèn)為《自我修養(yǎng)》想通過這個例子說明‘##’的使用方式,是不太恰當(dāng)?shù)摹O旅媸俏沂褂玫腉CC的版本信息:
Reading?specs?from?/usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.3.2/specs
Configured?with:?../configure?--with-as=/usr/ccs/bin/as?--with-ld=/usr/ccs/bin/ld?--disable-nls
Thread?model:?posix
gcc?version?3.3.2
??? 現(xiàn)在問題是這個‘...’了。
??? 如果說,宏定義本身就是‘字符串的替換’,那么,這里‘...’應(yīng)該沒有任何用處。于是,修改宏如下:
#define?printf(args)?fprintf(stdout,?args)
??? 結(jié)果編譯得到如下錯誤:
print.cpp:7:38:?macro?"printf"?passed?3?arguments,?but?takes?just?1
??? 為什么會這樣?沒找到原因,無論對args加上‘##’,還是‘()’,都是一樣的錯誤結(jié)果。
??? 實話說,我從未寫過類似'args ...'這樣的參數(shù),按我的理解,這語法檢查的實話就應(yīng)該出差了,但事實卻沒有。
???? 各位對'...'的用法有啥見解?
<----自作聰明的分割線---->
??? g++的 -C -E參數(shù)對付宏和模版的調(diào)試很好用。。。