Можно ли предотвратить удаление запятой с пустым __VA_ARGS__ в Visual C ++? - PullRequest
7 голосов
/ 18 августа 2011

В Visual Studio 2005 у меня есть макрос, который выглядит следующим образом (пример !!):

#define MY_CALL(FUN, ...) \
  if(prepare(x, y)) {     \
    FUN(__VA_ARGS__);     \
  }
/**/

Пока функция принимает хотя бы один аргумент, я в порядке.

Когда функция принимает нулевые аргументы, препроцессор «услужливо» удаляет «запятую», расширяя что-то вроде этого:

if(prepare(x y)) { funct(); }

Отлично, не правда ли?

КакЯ исправил этот макрос, чтобы он работал с нулями __VA_ARGS__ в Visual C ++ (VS 2005)?


Видимо это ошибка в VS2005 .

1 Ответ

6 голосов
/ 18 августа 2011

К сожалению, я больше не использую Visual C ++ (и поэтому не могу убедиться, что это работает), но можете ли вы попробовать это?

#define MY_CALL(FUN, ...) \
  if(prepare(x, y)) {     \
    int fail[] = {0,}     \
    FUN(__VA_ARGS__);     \
  }

При использовании gcc 4.2 и {0,}, и {0}разрешено в этом контексте, поэтому, если запятая удаляется или нет, это не имеет значения.Однако я не уверен, является ли это общепринятым в спецификации, обычно реализуемым расширением или чем-то специфичным для gcc.

Если синтаксис {0,} равен , разрешенному Visual C ++,тогда, надеюсь, это решит вашу проблему (при условии, что я правильно понимаю, что самая последняя запятая перед __VA_ARGS__ - это то, что неправильно удаляется, независимо от того, где оно появляется в синтаксисе).

...