2011-01-13 2 views
0

Gibt es einen Hack zu unterstützen Bereich Fall in einer c (99?) Oder objektive C-Switch-Anweisung? Ich weiß, das ist nicht so etwas schreiben unterstützt:Simulator/Generated Switch-Anweisung Bereich in c

switch(x) 
    case 1: 
    case 2..10: 
    case 11: 

Aber ich dachte, es sollte ein Weg sein, um Code mit einem #define Makro zu generieren. Natürlich kann ich einen Makro mit der Liste der Fälle definieren, aber ich war wie CASERANGE für einen eleganteren Weg der Hoffnung (x, x + 10), die erzeugen würde:

case x 
case x+1 
case x+2 

ist es sogar möglich?

+0

Warum gibt es zwei "Fälle 1"? Ist der zweite Fall 11? – BoltClock

+1

Warum nicht einfach 'if'-Anweisungen verwenden? –

+0

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

Antwort

3

GCC hat eine extension to the C language, die etwas ähnliches zu Ihrem ersten Beispiel erlaubt, aber abgesehen davon, wenn es eine portable/ANSI-Art und Weise zu tun wäre, wäre es jetzt getan worden. Ich glaube nicht, dass es einen gibt.

+0

+1 Dies scheint auch von Clang/LLVM unterstützt zu werden. –

+0

Schön! Ich hatte keine Ahnung, dass diese Erweiterungen existierten. Ich werde sie benutzen. Ich bin zurück zu C nachdem ich mit Ruby gespielt habe und ich habe mich an Programmiertricks gewöhnt. – CodeFlakes

+0

entgegen Ihrer Überzeugung gibt es eine Möglichkeit, dies in C99 zu tun und die gcc-Erweiterungen nicht einmal benötigt. Bitte sehen Sie meine Antwort. –

2

Dies mit Makros ist fast oder unmöglich. Compiler-Erweiterungen existieren, aber sie sind Compiler-spezifisch und nicht Cross-Plattform/Standard. Es gibt keinen Standardweg dafür, stattdessen if/else-Ketten zu verwenden.

2

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.

+0

Würden Sie das weiter ausbauen? Wie würde der OP-Code mit P99 aussehen? –

+0

@jcsalomon: rechts, siehe meine Bearbeitung. Ich denke, dass ich das auch zu P99 hinzufügen werde. –

Verwandte Themen