文字列を他の文字列と比較するためにif-elseラダーをエスケープすることはできません。通常のswitch-caseでさえ、内部的にはif-elseラダー(整数の場合)でもあります。文字列のswitch-caseのみをシミュレートしたい場合がありますが、if-elseラダーを置き換えることはできません。文字列比較のための最良のアルゴリズムは、strcmp関数の使用から逃れることはできません。不一致が見つかるまで文字ごとに比較することを意味します。したがって、if-elseラダーとstrcmpの使用は避けられません。
デモ
そして、これが文字列のswitch-caseをシミュレートするための最も単純なマクロです。
#ifndef SWITCH_CASE_INIT
#define SWITCH_CASE_INIT
#define SWITCH(X) for (char* __switch_p__ = X, int __switch_next__=1 ; __switch_p__ ; __switch_p__=0, __switch_next__=1) { {
#define CASE(X) } if (!__switch_next__ || !(__switch_next__ = strcmp(__switch_p__, X))) {
#define DEFAULT } {
#define END }}
#endif
そして、あなたはそれらをとして使うことができます
char* str = "def";
SWITCH (str)
CASE ("abc")
printf ("in abc\n");
break;
CASE ("def")
printf("in def\n");
CASE ("ghi")
printf ("in ghi\n");
DEFAULT
printf("in DEFAULT\n");
END
出力:
in def
in ghi
in DEFAULT
以下はネストされたSWITCHの使用法です。
char* str = "def";
char* str1 = "xyz";
SWITCH (str)
CASE ("abc")
printf ("in abc\n");
break;
CASE ("def")
printf("in def\n");
SWITCH (str1)
CASE ("uvw")
printf("in def => uvw\n");
break;
CASE ("xyz")
printf("in def => xyz\n");
break;
DEFAULT
printf("in def => DEFAULT\n");
END
CASE ("ghi")
printf ("in ghi\n");
DEFAULT
printf("in DEFAULT\n");
END
出力:
in def
in def => xyz
in ghi
in DEFAULT
これが逆文字列SWITCHで、CASE句で(定数ではなく)変数を使用できます。
char* str2 = "def";
char* str3 = "ghi";
SWITCH ("ghi")
CASE (str1)
printf ("in str1\n");
break;
CASE (str2)
printf ("in str2\n");
break;
CASE (str3)
printf ("in str3\n");
break;
DEFAULT
printf("in DEFAULT\n");
END
出力:
in str3