Макроизмененные параметры

У меня есть система с множеством наборов параметров "macroized" (макросы вида "#define name value,value,value). Я хотел бы передать их макросу, но когда я это делаю, я получаю ошибку.

пример:

void fn(int a, int b, int c){ return; }

#define MACRO_1(a, b, c) fn(a, b, c)
#define MACRO(...) MACRO_1(__VA_ARGS__)
#define PARAM1 1
#define PARAM2 2, 2
#define PARAM3 3, 3, 3

int main(int argc, char * argv[]){
   MACRO(0,0,0);
   MACRO(PARAM1,1, 1);
   MACRO(PARAM2,2);
   MACRO(PARAM3);
   return 0;
}

в Visual C I получаем:

1>c:\main.c(10): warning C4003: not enough actual parameters for macro 'MACRO_1'
1>c:\main.c(10): error C2059: syntax error : ','
1>c:\main.c(11): warning C4003: not enough actual parameters for macro 'MACRO_1'
1>c:\main.c(11): error C2059: syntax error : ','
1>c:\main.c(12): warning C4003: not enough actual parameters for macro 'MACRO_1'
1>c:\main.c(12): error C2059: syntax error : ','
1>c:\main.c(13): warning C4003: not enough actual parameters for macro 'MACRO_1'
1>c:\main.c(13): error C2059: syntax error : ','

1 ответ

Решение

Это ошибка в компиляторе Visual C++. Компилятор неправильно раскрывает пакет аргументов __VA_ARGS__ появляется в качестве аргумента для другого макроса.

Обходной путь должен использовать дополнительный уровень косвенности, чтобы заставить пакет аргумента variadic быть расширенным перед MACRO_1 вызывается:

#define MACRO_1(a, b, c) fn(a, b, c)
#define MACRO_1_(args_list) MACRO_1 args_list
#define MACRO(...) MACRO_1_((__VA_ARGS__))

Существует ошибка Microsoft Connect для этой проблемы: "Замена макроса Variadic". Если эта проблема важна для вас, пожалуйста, сообщите об этом сообщении об ошибке.

Другие вопросы по тегам