[語法] 關於 preprocessor 的問題

看板C_and_CPP (C/C++)作者 (好人超)時間16年前 (2009/11/13 13:38), 編輯推噓1(105)
留言6則, 1人參與, 最新討論串1/1
如果原本的程式是這樣寫的: 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

11/13 15:54, , 1F
這邊的 ## 跟其他地方你看到的 ## 其實是不同的..
11/13 15:54, 1F

11/13 15:55, , 2F
##是用來合並token, #是用來double quote, 這個你google
11/13 15:55, 2F

11/13 15:55, , 3F
一下, 有一堆文件. 而這邊的 ## 是 gcc 設計來消除最後
11/13 15:55, 3F

11/13 15:56, , 4F
一個 comma(,) 用的, 因為標準其實是要求那個comma要留著
11/13 15:56, 4F

11/13 15:56, , 5F
但會遇到你的情形, 所以用 ## 來消除, 像是VC的話, 會自動
11/13 15:56, 5F

11/13 15:56, , 6F
幫你消掉
11/13 15:56, 6F
文章代碼(AID): #1A_F3iIQ (C_and_CPP)
文章代碼(AID): #1A_F3iIQ (C_and_CPP)