PTT
Submit
Submit
選擇語言
正體中文
简体中文
PTT
C_and_CPP
[問題] VA_ARGS 和 ##VA_ARGS 的用法
作者:
Hyozero
(1)
2023-12-26 15:15:47
開發平台(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):
作者:
stupid0319
(徵女友)
2023-12-26 17:08:00
我只用過 va_list
作者: gusion
2023-12-26 18:35:00
第20行展開來後,printf的format string是"Message 1: ",裡面沒有%,所以後面參數被忽略,最後印出來就是這樣
作者:
Dracarys
(MayShowGunMore)
2023-12-26 21:36:00
如樓上所說,第20行展開中間有逗號,沒達到string concat的效果。至於你的PRINT3跟4,##是拿來把preprocessing tokens二合一,比如4會跟(合,合出非法pp-token已經是UB了。作為非標準的GNU extension:##只在逗號和__VA_ARGS__中間有特殊含義,就是你所謂的加強版。BTW, preprocessor過氣了,這樣寫比較潮:
https://godbolt.org/z/er7475aPq
作者:
lc85301
(pomelocandy)
2023-12-28 12:11:00
潮到我都要開除溼機了(yay
作者:
Lipraxde
(Lipraxde)
2023-12-29 13:38:00
也要 C++ 才能用這樣酷酷的寫法
作者:
kao50126
(無從)
2023-12-29 18:15:00
最近看標準 c23有新的__VA_OPT__ 看來是標準化gcc extension的行為?
作者:
LPH66
(-6.2598534e+18f)
2023-12-29 19:04:00
這個在 C++20 已經先行登場了, C23 只是跟上而已因為 __VA_ARGS__ 為空時的狀況本來就很討厭gcc 用 , ## __VA_ARGS__ 去「解決」其實是 hack就是五樓提的 ## 本來是用來把兩個 token 貼成一個逗號貼什麼東西都不是合法 token 所以就拿來 hack 成這行為C++20 登場的 __VA_OPT__ 的用途就是把這個邊界狀況給解決
作者:
kao50126
(無從)
2023-12-29 19:12:00
感謝解說
繼續閱讀
[問題] 在sub block做fopen並回傳問題
jacky1989
[問題] 在C#使用C++物件遇到的問題
Dong0129
[問題] 將物件傳遞進函數的問題
amamoimi
Re: [問題] 用函數設定參照的問題
cuteSquirrel
[問題] 用函數設定參照的問題
amamoimi
[問題] c++ 繼承問題
kakar0to
[問題] MCU處理LCD顯示繁體中文字
IntelNNP
Re: [問題] 在流程中插入檢查或不檢查 程式怎麼寫
wulouise
[贈書] 兩本很舊但狀況很好的原文書(送出)
in09
[問題] 在流程中插入檢查或不檢查 程式怎麼寫
saladim
Links
booklink
Contact Us: admin [ a t ] ucptt.com