В современном C (C99, с макросами переменной длины) это можно сделать с помощью макросов. Но вы, вероятно, не захотите кодировать это полностью самостоятельно. P99 предоставляет набор инструментов для этого. В частности, есть мета-макрос P99_FOR
, который позволяет развернуть списки аргументов конечной длины.
#define P00_CASE_FL(NAME, X, I) case I: NAME(X); break
#define CASES_FL(NAME, ...) P99_FOR(NAME, P99_NARG(__VA_ARGS__), P00_SEQ, P00_CASE_FL, __VA_ARGS__)
расширится CASES_FL(myFunc, oi, ui, ei)
до чего-то типа
case 0: myFunc(oi); break; case 1: myFunc(ui); break; case 2: myFunc(ei); break
Редактировать: , чтобы ответить на конкретный вопрос
#define P00_CASESEP(NAME, I, X, Y) X:; Y
#define P00_CASERANGE(NAME, X, I) case ((NAME)+I)
#define P99_CASERANGE(START, LEN) P99_FOR(START, LEN, P00_CASESEP, P00_CASERANGE, P99_REP(LEN,))
, где P00_CASESEP
просто обеспечивает наличие :;
между случаями, а P99_REP
создает список с LEN
пустыми аргументами.
Вы бы использовали это, например, как
switch(i) {
P99_CASERANGE('0',10): return i;
}
Соблюдайте :
после макроса, чтобы он был как можно ближе к обычному синтаксису регистра, а также что параметр LEN
должен расширяться до простого десятичного числа, а не выражения или около того.