Ответ 1
Дмитрий прав, переменные макросы - это путь.
Я помещаю некоторый пример кода, который я использую для проверки, если данный ключ является членом списка значений:
#define _IN(KEY, ...) \
({ \
typedef __typeof (KEY) _t; \
const _t _key = (KEY); \
const _t _values[] = { __VA_ARGS__ }; \
_Bool _r = 0; \
unsigned int _i; \
for (_i = 0; _i < sizeof (_values) / sizeof (_values[0]); ++_i) \
if (_key == _values[_i]) \
{ \
_r = 1; \
break; \
} \
_r; \
})
Обратите внимание на использование __VA_ARGS__
.
Update:
Неочищенное решение, если вам не нравится __VA_ARGS__
в произвольных местах, будет макросом "развертки":
#define UNWRAP(...) __VA_ARGS__
Вы можете использовать его как префикс-оператор.; -)
#include <stdio.h>
/* "unwrapper": */
#define UNWRAP(...) __VA_ARGS__
/* your macros: */
#define WRAP(NAME, ELEMS) static const char *NAME[] = { UNWRAP ELEMS }
int
main (void)
{
WRAP (some_test, ("a", "b", "c"));
printf ("The second elem in some_test is: '%s'\n", some_test[1]);
return 0;
}