2011-01-13 9 views
0

c(99?)または目的のCスイッチステートメントで範囲の大文字小文字をサポートするためのハックはありますか? 私は、これはこのような何かを書くためにサポートされていません知っている:Simulater/Generated switchステートメントの範囲を

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

しかし、私はの#defineマクロでコードを生成する方法があるはず考えていました。もちろん 私は例のリストでマクロを定義することができますが、私は CASERANGE(X、X + 10)生成するような、よりエレガントな方法を期待していた:

case x 
case x+1 
case x+2 

はそれも可能ですか?

+0

そこに2つの「ケース1」があるのはなぜですか? 2番目のケースは「ケース11」ですか? – BoltClock

+1

単に 'if'文を代わりに使うのはなぜですか? –

+0

2番目の1はタイプミスです。 If文は問題を解決しない。私はまだそれらすべてを書かなければならない。とにかく、switch文は状況に応じて読むのがはっきりしていると思います。 – CodeFlakes

答えて

3

GCCにはextension to the C languageがあります。これは、最初の例と似たようなことが可能ですが、それ以外の場合、ポータブル/ ANSIの方法であれば、これまでに完了しているはずです。私は1つがあるとは思わない。

+0

+1これはClang/LLVMでもサポートされているようですので、今後は安全に使うべきです。 –

+0

ニース!私はそれらの拡張が存在するかどうか分からなかった。私はそれらを使用するつもりです。私はRubyと遊んだ後にCに戻ってきました。そして、私は高水準プログラミングの習慣に慣れました。 – CodeFlakes

+0

あなたの考えに反して、C99でこれを行う方法があり、gcc拡張機能は必要ない。私の答えを見てください。 –

2

マクロでこれを行うことは、近いか不可能です。コンパイラ拡張は存在しますが、コンパイラ固有であり、クロスプラットフォーム/標準ではありません。これを行う標準的な方法はありません。代わりにif/elseチェーンを使用してください。

2

最近の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__) 

case 0: myFunc(oi); break; case 1: myFunc(ui); break; case 2: myFunc(ei); break 

編集のようなものにCASES_FL(myFunc, oi, ui, ei)を拡大する:具体的なご質問にはお答えし

#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; 
} 

としてその例を使用したいです数ではなく、式などです。

+0

あなたはそれを拡張しますか?具体的には、OPのコードはP99でどのように見えますか? –

+0

@jcsalomon:右、私の編集を参照してください。私はそれをP99にも追加すると思います。 –

関連する問題