推 stupid0319: 我只用過 va_list 12/26 17:08
推 gusion: 第20行展開來後,printf的format string是"Message 1: ", 12/26 18:35
→ gusion: 裡面沒有%,所以後面參數被忽略,最後印出來就是這樣 12/26 18:35
推 Dracarys: 如樓上所說,第20行展開中間有逗號,沒達到string conc 12/26 21:36
→ Dracarys: at的效果。至於你的PRINT3跟4,##是拿來把preprocessin 12/26 21:36
→ Dracarys: g tokens二合一,比如4會跟(合,合出非法pp-token已經 12/26 21:36
→ Dracarys: 是UB了。作為非標準的GNU extension:##只在逗號和__VA 12/26 21:36
→ Dracarys: _ARGS__中間有特殊含義,就是你所謂的加強版。 12/26 21:36
推 Dracarys: BTW, preprocessor過氣了,這樣寫比較潮: 12/26 23:19
推 lc85301: 潮到我都要開除溼機了(yay 12/28 12:11
推 Lipraxde: 也要 C++ 才能用這樣酷酷的寫法 12/29 13:38
→ kao50126: 最近看標準 c23有新的__VA_OPT__ 看來是標準化gcc exte 12/29 18:15
→ kao50126: nsion的行為? 12/29 18:15
推 LPH66: 這個在 C++20 已經先行登場了, C23 只是跟上而已 12/29 19:04
→ LPH66: 因為 __VA_ARGS__ 為空時的狀況本來就很討厭 12/29 19:04
→ LPH66: gcc 用 , ## __VA_ARGS__ 去「解決」其實是 hack 12/29 19:05
→ LPH66: 就是五樓提的 ## 本來是用來把兩個 token 貼成一個 12/29 19:07
→ LPH66: 逗號貼什麼東西都不是合法 token 所以就拿來 hack 成這行為 12/29 19:08
→ LPH66: C++20 登場的 __VA_OPT__ 的用途就是把這個邊界狀況給解決 12/29 19:09
推 kao50126: 感謝解說 12/29 19:12