作者james732 (好人超)
站內C_and_CPP
標題[語法] 關於 preprocessor 的問題
時間Fri Nov 13 13:38:50 2009
如果原本的程式是這樣寫的:
1 #include <stdio.h>
2
3 #define debug(fmt, ...) fprintf(stderr, fmt "\n", __VA_ARGS__)
4
5 int main()
6 {
7 debug("Hello world");
8 }
那麼就會因為多了一個 , 而導致編譯失敗:
int main()
{
fprintf(stderr, "Hello world" "\n"
, );
}
但如果在 __VA_ARGS__ 前加上 ## 的話:
1 #include <stdio.h>
2
3 #define debug(fmt, ...) fprintf(stderr, fmt "\n",
##__VA_ARGS__)
4
5 int main()
6 {
7 debug("Hello world");
8 }
這個冒號就會被自動消除了,而編譯成功:
int main()
{
fprintf(stderr, "Hello world" "\n");
}
在這個網頁裡:
http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html
有解釋會發生這種情況,但我還是不明白它的原因
所以我的問題是:
不知道什麼時候該加 #,什麼時候該加 ##,什麼時候都不用加
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.117.171.46
推 cole945:這邊的 ## 跟其他地方你看到的 ## 其實是不同的.. 11/13 15:54
→ cole945:##是用來合並token, #是用來double quote, 這個你google 11/13 15:55
→ cole945:一下, 有一堆文件. 而這邊的 ## 是 gcc 設計來消除最後 11/13 15:55
→ cole945:一個 comma(,) 用的, 因為標準其實是要求那個comma要留著 11/13 15:56
→ cole945:但會遇到你的情形, 所以用 ## 來消除, 像是VC的話, 會自動 11/13 15:56
→ cole945:幫你消掉 11/13 15:56