- 締切済み
C言語switch文のcase記述について
switch文のcaseがたくさんあるため、ソースファイルとして外だししたいと思っています。 ただ、switch文そのものはきちんと記述し、caseの部分だけを外だしできればと考えています。 例 switch (a) { case 1: case 2: : :(たくさん続く) 処理A; case 100; case 101; : : (これまたたくさん続く) 処理B; } を switch (a) { A_WO_SURU_JOUKEN /* この記述を外だししたい */ 処理A; B_WO_SURU_JOUKEN /* 同じく */ 処理B; } といった具合にしてみたいということです。 ヘッダファイルを使う、defineでの記述で可能といったものを教えていただければ幸いです。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- vege-g49
- ベストアンサー率100% (3/3)
defineを使用するのではなく、 分岐を判断する関数を作って 使用する方法はどうでしょうか? 以下 if文とswitch文を使用してみました。 -- 分岐を判断する関数 -- IsCaseA(int a) { switch(a) { case 1: case 2: ・・・ return 1; } return 0; } IsCaseB(int a) { switch(a) { case 100; case 101; ・・・ return 1; } return 0; } -- 本文 -- if( IsCaseA(a) ) { 処理A; } else if( IsCaseB(a) ) { 処理B; } これだと本文が短くなりますし、 将来 case の追加する場合も、行追加で容易に対応できます。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス ・いろいろと分け方がありますが処理A、処理Bなどの部分をマクロ関数や普通に関数として 分離する方法が私が良く取る方法です。 例えば: switch ( a ){ case 1: case 2: : 処理A; : case 100; case 101; : 処理B; : } ならば #define ShoriA()\ {\ :\ 処理Aの本体;\ :\ } #define ShoriB()\ {\ :\ 処理Bの本体;\ :\ } switch ( a ){ case 1: case 2: ShoriA(); break; case 100: case 101: ShoriB(); break; : 同様にする : } その他: ・処理A、処理Bを関数にするよりは define で関数と同じような感じで定義します。 これを専用のヘッダファイルにでも保存するか、switch 文のある関数よりも上の方に まとめて定義すればいいと思います。マクロ関数にする理由は変数スコープを考えて 関数よりも良いと思っただけです。C++ で『参照』を使えば関数やinline関数でも良い。 ・またマクロ関数にするときに行末に必ず『\』文字を追加します。 このマクロ関数内で変数を宣言して利用することも出来ます。 あとマクロ関数の終わりのブロックで『break』を記述して switch 文の break を なくしても見やすくなります。私の場合は次のキーワードを定義して利用しています。 #define CASE break;case #define DEFAULT break;default この2行を良く利用するヘッダに記述して include して次のように使っています。 switch ( a ){ CASE 1: case 2: ShoriA(); CASE 100: case 101: ShoriB(); : CASE 200: case 201: ShoriZ(); DEFAULT: ShoriElse(); } ・switch文の case、default の多くは break を記述する分岐ですから break 付きの CASE、DEFAULT を記号定数で定義して利用するわけです。ただ今回のような使い方は CASE、case を2つ記述する事になるため case で統一した方が良いでしょう。 ・break付きのCASE、DEFAULTを使うときは条件式が1つの場合に限ります。 つまり switch ( a ){ CASE 条件式1: 処理; CASE 条件式2: 処理; CASE 条件式3: 処理; : CASE 条件式n: 処理; DEFAULT: 残りの処理; } こんな感じの分岐です。 ・以上。
- don_go
- ベストアンサー率31% (336/1059)
a の値が連番になるのであれば関数ポインタを使えますが? 関数ポインタ http://wisdom.sakura.ne.jp/programming/c/c54.html #include <stdio.h> void kitty(void); void sakura(void); void hina(void); int main() { void (*po[])() = { kitty , sakura , hina }; int i; printf("実行する関数の番号を指定してください 0~2>"); scanf("%d" , &i); if ((i < 0) | (i > 2)) return 0; (*po[i])(); return 0; } void kitty() { printf("Kitty on your lap\n"); } void sakura() { printf("Card Captor SAKURA"); } void hina() { printf("LOVE HINA"); }
お礼
関数ポインタというのもあるのですね。 なかなか奥が深いです。 ただ今回は、上記であれば入力値が多くの種類があるので、どちらかといえば、iを用意する必要があるので、量は多くなりそうです。 勉強になりました。 ありがとうございます。
- lesskey
- ベストアンサー率33% (66/200)
-- #define A_WO_SURU_JOUKEN \ case 1: case 2: case 3: case 4: case 5: \ case 6: case 7: case 8: -- 上記でquothさんのしたいことは出来るかと・・・ A_WO_SURU_JOUKEN をソースコードに組み込むと case 1~8 で解釈されます。 因みにそんなにケースが大量にあるのならif文で範囲指定をする、 配列を使う・・・など別の方法を考えた方がスマートですね。
お礼
やはり大量にある場合は、if文か配列をつかった方が早い気がしてきました。(配列のほうがわかりやすいかな。) ただ、difineを\でつなげないといけないというのは勉強になりました。ありがとうございます。
- koko_u_
- ベストアンサー率18% (459/2509)
簡単に思い付くのは case 文を止めて if 文にするとか、 論理和で case (A_CASE | B_CASE | C_CASE): とできるように定数を定義するとか。
お礼
やはりif文のほうがよさそうでしょうか。 範囲指定だとロジックの変更になるので、できれば定義を変えるだけでできるようにしたいと思っております。 (どちらも一緒じゃないかと思うのですが、お客様がそういう人なもので。) 回答ありがとうございました。
お礼
defineにする時は\が必要なのですね。勉強になりました。 今回はcase文が多くなるパターンですので、もう少し見てみようと思います。