看板 C_and_CPP 關於我們 聯絡資訊
如果原本的程式是這樣寫的: 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