最近の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;
}
としてその例を使用したいです数ではなく、式などです。
そこに2つの「ケース1」があるのはなぜですか? 2番目のケースは「ケース11」ですか? – BoltClock
単に 'if'文を代わりに使うのはなぜですか? –
2番目の1はタイプミスです。 If文は問題を解決しない。私はまだそれらすべてを書かなければならない。とにかく、switch文は状況に応じて読むのがはっきりしていると思います。 – CodeFlakes