C++ 如何选择发送到宏的第一个参数(仅使用可变参数)
我尝试获取发送到可变宏的第一个实际参数。这是我尝试过的,但在VS2010中不起作用: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宏所解决的问题相反。我知道“宏参数
#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。。。总是更好的惊喜编译器:'(