Vir*_*721 7 c macros visual-c++ variadic-macros
我发现了一个问题,显示如何根据参数的数量 重载宏:在参数数量上重载宏
但正如他们所说,它不能使用MSVC,因为MSVC扩展__VA_ARGS__为单个标记而不是参数列表(arg1, arg2, arg3).
他们指出另一个问题,其中给出了一个解决方法:MSVC没有正确扩展__VA_ARGS__ 但是根本没有解释,所以我不能适应我自己的情况,因为我无法理解它.
你能解释一下这个解决方法的工作原理吗?
Joh*_*ger 11
有问题的解决方法是这样的:
#define EXPAND( x ) x
#define F(x, ...) X = x and VA_ARGS = __VA_ARGS__
#define G(...) EXPAND( F(__VA_ARGS__) )
Run Code Online (Sandbox Code Playgroud)
这个想法是给定一个现有的可变宏F():
#define F(x, ...) X = x and VA_ARGS = __VA_ARGS__
Run Code Online (Sandbox Code Playgroud)
而不是写你想要的variadic包装宏,在这种情况下,...
#define G(...) F(__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)
...你G()使用额外的EXPAND()宏写.实际的定义F()不是重点,特别是对于这个例子,宏扩展不会产生有效的C代码.其目的是演示预处理器关于宏参数的行为.具体来说,它表明尽管MSVC扩展__VA_ARGS__为可变参数宏中的单个标记,但可以通过强制进行双重扩展来解决这个问题.
例如,使用变通方法定义,预处理器首先扩展...
G(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
... 至 ...
EXPAND( F(1, 2, 3) )
Run Code Online (Sandbox Code Playgroud)
... 1, 2, 3被视为单个令牌的地方.这符号化不再是问题了额外的替代预处理重新扫描时,但是:它看到的1,2,3作为单独的参数宏F(),并扩大了为所需生产的参数宏EXPAND(),刚刚与自己替换它.
如果你觉得奇怪的是它按预期工作,但没有的版本EXPAND()不起作用(在MSVC中),你是对的.
| 归档时间: |
|
| 查看次数: |
1691 次 |
| 最近记录: |