我尝试获取发送到可变参数宏的第一个实际参数。这就是我试过的,哪些在VS2010中不起作用:
#define FIRST_ARG(N, ...) N
#define MY_MACRO(...) decltype(FIRST_ARG(__VA_ARGS__))
当我查看预处理器输出时,我看到FIRST_ARG
返回发送给MY_MACRO
的整个参数列表......
另一方面,当我尝试:
FIRST_ARG(1,2,3)
按预期扩展为1.
这似乎是臭名昭着的两级concat宏解决问题的逆转。我知道“宏参数在插入宏体之前已完全展开”,但这似乎对我没有帮助,因为我不明白这在... __VA_ARGS__
显然__VA_ARGS__
绑定到N
并且仅在稍后进行评估。我尝试了几种额外的宏观方法,但没有帮助。
答案 0 :(得分:7)
这是a bug in the Visual C++ preprocessor。列出的解决方法有效。这样:
#define FIRST_ARG_(N, ...) N
#define FIRST_ARG(args) FIRST_ARG_ args
#define MY_MACRO(...) decltype(FIRST_ARG((__VA_ARGS__)))
MY_MACRO(x, y, z)
扩展为:
decltype(x)