Как выделить первый параметр, отправленный макросу, принимая только переменный параметр - PullRequest
4 голосов
/ 20 января 2011

Я пытаюсь получить первый фактический параметр, отправленный в макрос с переменным числом аргументов.Это то, что я пробовал, и что не работает в VS2010:

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

Когда я смотрю на вывод препроцессора, я вижу, что FIRST_ARG возвращает весь список аргументов, отправленный на MY_MACRO ...

С другой стороны, когда я пытаюсь использовать:

FIRST_ARG(1,2,3)

, он расширяется до 1, как и предполагалось.

Это, кажется, как-то противоположно проблеме, решаемой печально известнойдвухуровневые конкатные макросы.Я знаю, что «параметры макроса полностью раскрываются перед вставкой в ​​тело макроса», но мне это здесь не поможет, поскольку я не понимаю, что это означает в контексте ... и __VA_ARGS__

Очевидно, __VA_ARGS__ связывается с N и оценивается только позже.Я пробовал несколько способов с дополнительными макроуровнями, но это не помогло.

1 Ответ

8 голосов
/ 20 января 2011

Это ошибка в препроцессоре 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)
...