Im modernen C (C99, mit Makros variabler Länge) ist dies mit Makros möglich. Aber Sie würden das wahrscheinlich nicht komplett selbst programmieren wollen. P99 bietet hierfür eine Toolbox. Insbesondere gibt es ein Meta-Makro P99_FOR
, mit dem Sie endliche Argumentlisten abwickeln können.
#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__)
würde erweitern CASES_FL(myFunc, oi, ui, ei)
um so etwas wie
case 0: myFunc(oi); break; case 1: myFunc(ui); break; case 2: myFunc(ei); break
Edit: auf die konkrete Frage
#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,))
wo P00_CASESEP
gewährleistet nur, dass es die :;
zwischen den Fällen zu antworten, und P99_REP
erzeugt eine Liste mit LEN
leere Argumente.
würden Sie, dass zB verwenden, wie
switch(i) {
P99_CASERANGE('0',10): return i;
}
Beachten Sie die :
nach dem Makro zu halten, so nah wie möglich zu der üblichen Fall Syntax, und auch, dass die LEN
Parameter auf eine Ebene dezimal erweitern haben Nummer, kein Ausdruck oder so.
Warum gibt es zwei "Fälle 1"? Ist der zweite Fall 11? – BoltClock
Warum nicht einfach 'if'-Anweisungen verwenden? –
die zweite 1 ist ein Tippfehler. Wenn Anweisungen das Problem nicht lösen. Ich muss sie immer noch schreiben. Und wie auch immer ich denke, switch statement ist je nach Situation klarer zu lesen. – CodeFlakes