[問題] VA_ARGS 和 ##VA_ARGS 的用法

看板C_and_CPP (C/C++)作者 (大寶)時間11月前 (2023/12/26 15:15), 編輯推噓8(8013)
留言21則, 7人參與, 10月前最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Linux 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): https://zhuanlan.zhihu.com/p/514246786 ##VA_ARGS 看起來是 VA_ARGS的加強版或好用版 在額外的參數數量是0時, 能夠避免compile error 想請教如附件程式碼 1. 第20行, 只能print出第一個參數 Message 1: , 而不是預期的 Message 1: a = 40.00, b = 6.3246 2.第24,25,27行, compile error 這樣的結果和文章寫的似乎不太一致 想請教高手大大, 是不是我哪裡理解有錯誤呢? 謝謝 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) https://ideone.com/cS0XH4 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.116.232.222 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1703574949.A.B98.html

12/26 17:08, 11月前 , 1F
我只用過 va_list
12/26 17:08, 1F

12/26 18:35, 11月前 , 2F
第20行展開來後,printf的format string是"Message 1: ",
12/26 18:35, 2F

12/26 18:35, 11月前 , 3F
裡面沒有%,所以後面參數被忽略,最後印出來就是這樣
12/26 18:35, 3F

12/26 21:36, 11月前 , 4F
如樓上所說,第20行展開中間有逗號,沒達到string conc
12/26 21:36, 4F

12/26 21:36, 11月前 , 5F
at的效果。至於你的PRINT3跟4,##是拿來把preprocessin
12/26 21:36, 5F

12/26 21:36, 11月前 , 6F
g tokens二合一,比如4會跟(合,合出非法pp-token已經
12/26 21:36, 6F

12/26 21:36, 11月前 , 7F
是UB了。作為非標準的GNU extension:##只在逗號和__VA
12/26 21:36, 7F

12/26 21:36, 11月前 , 8F
_ARGS__中間有特殊含義,就是你所謂的加強版。
12/26 21:36, 8F

12/26 23:19, 11月前 , 9F
BTW, preprocessor過氣了,這樣寫比較潮:
12/26 23:19, 9F

12/26 23:19, 11月前 , 10F

12/28 12:11, 10月前 , 11F
潮到我都要開除溼機了(yay
12/28 12:11, 11F

12/29 13:38, 10月前 , 12F
也要 C++ 才能用這樣酷酷的寫法
12/29 13:38, 12F

12/29 18:15, 10月前 , 13F
最近看標準 c23有新的__VA_OPT__ 看來是標準化gcc exte
12/29 18:15, 13F

12/29 18:15, 10月前 , 14F
nsion的行為?
12/29 18:15, 14F

12/29 19:04, 10月前 , 15F
這個在 C++20 已經先行登場了, C23 只是跟上而已
12/29 19:04, 15F

12/29 19:04, 10月前 , 16F
因為 __VA_ARGS__ 為空時的狀況本來就很討厭
12/29 19:04, 16F

12/29 19:05, 10月前 , 17F
gcc 用 , ## __VA_ARGS__ 去「解決」其實是 hack
12/29 19:05, 17F

12/29 19:07, 10月前 , 18F
就是五樓提的 ## 本來是用來把兩個 token 貼成一個
12/29 19:07, 18F

12/29 19:08, 10月前 , 19F
逗號貼什麼東西都不是合法 token 所以就拿來 hack 成這行為
12/29 19:08, 19F

12/29 19:09, 10月前 , 20F
C++20 登場的 __VA_OPT__ 的用途就是把這個邊界狀況給解決
12/29 19:09, 20F

12/29 19:12, 10月前 , 21F
感謝解說
12/29 19:12, 21F
文章代碼(AID): #1bYdsbkO (C_and_CPP)
文章代碼(AID): #1bYdsbkO (C_and_CPP)