如何单独输出发送到仅采用可变参数的宏的第一个参数

时间:2011-01-20 17:54:39

标签: c++ c++11 macros c-preprocessor variadic-macros

我尝试获取发送到可变参数宏的第一个实际参数。这就是我试过的,哪些在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并且仅在稍后进行评估。我尝试了几种额外的宏观方法,但没有帮助。

1 个答案:

答案 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)