7

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

4

1 回答 1

10

这是Visual C++ 预处理器中的一个错误。那里列出的解决方法有效。这个:

#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)
于 2011-01-20T17:57:58.137 回答