Препроцессор C ++ __VA_ARGS__ количество аргументов - PullRequest
83 голосов
/ 23 января 2010

Простой вопрос, на который я не смог найти ответ в сети. В макрокоманде переменных аргументов, как найти количество аргументов? Я в порядке с форсированным препроцессором, если у него есть решение.

Если это имеет значение, я пытаюсь преобразовать переменное число макро-аргументов, чтобы увеличить последовательность, список или массив препроцессора для дальнейшей обработки.

Ответы [ 11 ]

0 голосов
/ 20 марта 2015

Вы можете проверять токены и считать их:

int countArgs(char *args)
{
  int result = 0;
  int i = 0;

  while(isspace(args[i])) ++i;
  if(args[i]) ++result;

  while(args[i]) {
    if(args[i]==',') ++result;
    else if(args[i]=='\'') i+=2;
    else if(args[i]=='\"') {
      while(args[i]) {
        if(args[i+1]=='\"' && args[i]!='\\') {
          ++i;
          break;
        }
        ++i;
      }
    }
    ++i;
  }

  return result;
}

#define MACRO(...) \
{ \
  int count = countArgs(#__VA_ARGS__); \
  printf("NUM ARGS: %d\n",count); \
}
...