??? 看《xxx的自我修養》里面有一段關于“變長參數宏”的代碼:
#include?<stdio.h>
#define?printf(args
)?fprintf(stdout,?##args)
int?main()
{
????????printf("\n%d,?%s\n",?0,?"test");
????????return?0;
} ??? 代碼不長,編譯也未見問題,結果也正常,演示了其想說明的部分。根據其意,‘##’宏用于字符串的連接操作,即將參數‘args’部分連接成一個字符串傳給fprintf函數。但我認為宏定義本身就是‘字符串的替換’,完全不需要‘##’,即,傳人的‘args’是什么,fprintf被傳人的也是什么,不會有任何變化,也無需作任何操作,因此我修改宏如下:
#define?printf(args?
)?fprintf(stdout,?args) ??? 嗯,我獲得了相同的正常結果。
?? 從結果看,我認為《自我修養》想通過這個例子說明‘##’的使用方式,是不太恰當的。下面是我使用的GCC的版本信息:
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
??? 現在問題是這個‘...’了。
??? 如果說,宏定義本身就是‘字符串的替換’,那么,這里‘...’應該沒有任何用處。于是,修改宏如下:
#define?printf(args)?fprintf(stdout,?args)
??? 結果編譯得到如下錯誤:
print.cpp:7:38:?macro?"printf"?passed?3?arguments,?but?takes?just?1
??? 為什么會這樣?沒找到原因,無論對args加上‘##’,還是‘()’,都是一樣的錯誤結果。
??? 實話說,我從未寫過類似'args ...'這樣的參數,按我的理解,這語法檢查的實話就應該出差了,但事實卻沒有。
???? 各位對'...'的用法有啥見解?
<----自作聰明的分割線---->
??? g++的 -C -E參數對付宏和模版的調試很好用。。。