C++ 如何选择发送到宏的第一个参数(仅使用可变参数)

C++ 如何选择发送到宏的第一个参数(仅使用可变参数),c++,c++11,macros,c-preprocessor,variadic-macros,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宏所解决的问题相反。我知道“宏参数

我尝试获取发送到可变宏的第一个实际参数。这是我尝试过的,但在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宏所解决的问题相反。我知道“宏参数在插入宏体之前完全展开”,但这似乎对我没有帮助,因为我不明白这在上下文中意味着什么。。。和
\uuu VA\u ARGS\uuuu

显然,
\uuu VA\u ARGS\uuu
绑定到
N
,只在以后进行评估。我尝试了几种增加宏级别的方法,但都没有效果。

这是一个很好的例子。此处列出的解决方法有效。这:

#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)

我注意到link有一个“变通方法”,看起来可能会有帮助。@aschepler:是的;我只是看着它,并用OP的用例进行测试。它工作得很好,我在答案中添加了一个演示。该解决方案还演示了编写宏时的首要规则:“如果最初没有成功,请添加更多括号。”;-)另见gee VS。。。总是更好的惊喜编译器:'(