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

Ben*_*son 5 c++ macros c-preprocessor variadic-macros c++11

我尝试获取发送到可变参数宏的第一个实际参数.这是我试过的,哪些在VS2010中不起作用:

#define FIRST_ARG(N, ...) N
#define MY_MACRO(...) decltype(FIRST_ARG(__VA_ARGS__))
Run Code Online (Sandbox Code Playgroud)

当我查看预处理器输出时,我看到FIRST_ARG返回发送给MY_MACRO... 的整个参数列表

另一方面,当我尝试:

FIRST_ARG(1,2,3)
Run Code Online (Sandbox Code Playgroud)

它按预期扩展到1.

这似乎是臭名昭着的两级concat宏解决问题的逆转.我知道"宏参数在插入宏体之前已完全展开"但这似乎对我没有帮助,因为我不明白这意味着什么......和__VA_ARGS__

显然是__VA_ARGS__绑定,N只是稍后评估.我尝试了几种额外的宏观方法,但没有用.

Jam*_*lis 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)
Run Code Online (Sandbox Code Playgroud)

扩展为:

decltype(x)
Run Code Online (Sandbox Code Playgroud)

  • @aschepler:是的;我只是看着它并使用 OP 的用例对其进行测试。它工作得很好,我在答案中添加了一个演示。该解决方法还演示了编写宏时的总体规则:“如果一开始没有成功,请添加更多括号。” ;-) (3认同)
  • 哎呀VS...总是更好的惊喜编译器:'( (2认同)