[问题] 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
感谢解说

Links booklink

Contact Us: admin [ a t ] ucptt.com