How to single out the first parameter sent to a macro taking only a variadic parameter

孤街浪徒 提交于 2019-12-12 11:13:27

问题


I try to get at the first actual parameter sent to a variadic macro. This is what I tried, and which does not work in VS2010:

#define FIRST_ARG(N, ...) N
#define MY_MACRO(...) decltype(FIRST_ARG(__VA_ARGS__))

When I look at the preprocessor output I see that FIRST_ARG returns the entire argument list sent to MY_MACRO...

On the other hand when I try with:

FIRST_ARG(1,2,3)

it expands to 1 as intended.

This seems to be somehow the inverse of the problem solved by the infamous two level concat macros. I know that "macro parameters are fully expanded before inserted in the macro body" but this does not seem to help me here as I don't understand what this means in the context of ... and __VA_ARGS__

Obviously __VA_ARGS__ binds to N and is only evaluated later. I tried several ways with extra macro levels but it didn't help.


回答1:


This is a bug in the Visual C++ preprocessor. The workaround listed there works. This:

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

expands to:

decltype(x)


来源:https://stackoverflow.com/questions/4750688/how-to-single-out-the-first-parameter-sent-to-a-macro-taking-only-a-variadic-par

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!