Ответ от Yunnosch - это хорошо, но, чтобы немного ускорить безумие X-макроса, вы также можете сделать это с помощью вызова макроса внутри списка, а не макроса-оболочки вне него.Преимущество этого в том, что вы можете передавать «переменные» из списка вызываемому макросу.
Я полагаю, что это может иметь какое-то применение - предположим, например, что вы хотите использовать макрос X для объявления функций различныхтипы?
Пример:
#define MAX_PRIME 5
#define CREATE_FUNC(func, ret_type, param) func(ret_type, param)
#define PRIMES_X(func) \
CREATE_FUNC(func, int, 2) \
CREATE_FUNC(func, void, 3) \
CREATE_FUNC(func, double, MAX_PRIME) \
#define MAKE_FUNC(ret_type, num) ret_type foo ## num(void);
PRIMES_X(MAKE_FUNC)
#undef MAKE_FUNC
Отладочный код для проверки того, что функции действительно получили ожидаемые прототипы:
int main(void)
{
(void)foo2();
foo3();
(void)foo5();
}
int foo2 (void){ return 0;}
void foo3 (void){}
double foo5 (void){ return 0.0;}