C では、char 配列 (文字列) に相当する「ケース」はありませんが、ビット シフト マクロとスイッチ ケースを使用してある程度実現できます。
#define FIVE_CHARS(c1,c2,c3,c4,c5) (((((((((c5)<<7)|(c4))<<6)|(c3))<<6)|(c2))<<6)|(c1))
while (argc-->0){
switch ( FIVE_CHARS(argv[argc][0],argv[argc][1],argv[argc][2],argv[argc][3],argv[argc][4]) ){
case FIVE_CHARS('-','h','e','l','p') :
case FIVE_CHARS('-','-','h','e','l') :
case FIVE_CHARS('-','h','\0','\0','\0') :
case FIVE_CHARS('-','?','\0','\0','\0') :
usage();
break;
case FIVE_CHARS('-','a','r','g','1') :
setflag1();
break;
default:
assert("Argument not supported");
}
}
コンパイラは、これを一連の if として少数の比較でコンパイルするか、多数のジャンプ テーブルとしてコンパイルします。ほとんどのビット シフト (case ステートメント内のもの) は実行時ではなくコンパイル時に行われ、残りのビット シフト操作 (switch 内のもの) は比較的安価であり、 1回の比較で1回だけ必要です(基本的に、最も一般的なパスを最初に配置する必要がなくなります)... 5文字が一致する場合は、珍しい文字に追加のスイッチケースを追加するか、単に strcmp() を使用できます。 .. ただし、 if strcmp() {} else if strcmp() {} else の巨大なネストされたツリーよりも、いくつかのケースでのみ strcmp が必要な方がよいでしょう ...