Проблема с __VA_ARGS__ - PullRequest
       48

Проблема с __VA_ARGS__

1 голос
/ 08 января 2011

препроцессор C ++ __VA_ARGS__ количество аргументов

Принятый ответ там не работает для меня.Я пробовал с MSVC ++ 10 и g ++ 3.4.5.

Я также сжал пример до чего-то меньшего и начал пытаться вывести мне некоторую информацию об ошибке:

template < typename T >
struct print;

#include <boost/mpl/vector_c.hpp>

#define RSEQ_N 10,9,8,7,6,5,4,3,2,1,0
#define ARG_N(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,N,...) N
#define ARG_N_(...) ARG_N(__VA_ARGS__)

#define XXX 5,RSEQ_N

#include <iostream>
int main()
{
  print< boost::mpl::vector_c<int, ARG_N_( XXX ) > > g; // ARG_N doesn't work either.
}

Мне кажется, что аргументом для ARG_N является 'XXX' вместо 5,RSEQ_N и намного меньше 5,10,...,0.Вывод ошибки g ++ более конкретно говорит о том, что предоставляется только один аргумент.

Не могу поверить, что ответ будет предложен, а затем принят, когда он полностью не сработает, так что я делаю неправильно?Почему XXX интерпретируется как аргумент и не расширяется?В моем собственном баловстве все работает нормально, пока я не попытаюсь выдать VA_ARGS макросу, содержащему несколько имен, за которыми следуют ... вот так:

#define WTF(X,Y,...) X , Y , __VA_ARGS__
#define WOT(...) WTF(__VA_ARGS__)

WOT(52,2,5,2,2)

Я пробовал обаи без () в различных макросах, которые не требуют ввода.

Ответы [ 2 ]

1 голос
/ 08 января 2011

Я не вижу ничего плохого в ваших макросах.

При использовании g ++ 4.5.1 (в режиме C ++ 0x) и mcpp ARG_N_( XXX ) корректно заменяется на 1.

Это сообщенная ошибка в Visual C ++ .

1 голос
/ 08 января 2011

__VA_ARGS__ - это инновация C99, которая не является частью стандарта C ++.Различные компиляторы могут опционально поддерживать его, но это не технически допустимый код C ++.Это может объяснить некоторые проблемы, с которыми вы сталкиваетесь.

...