私はシンプルで実用的なコードを持っていました(不要なものを削除し、本質だけを残しました):
typedef enum { enNone, enOne, enTwo, enThree }TEnum; switch(Enum) { case enNone: break; case enOne: Value=f1(Value); Value=A*Value+B; break; case enTwo: Value=f2(Value); Value=A*Value+B; break; case enThree: Value=f3(Value); Value=A*Value+B; break; }
私は彼に対して大きな不満はありませんでしたが、彼を微最適化することにしました
冗長性を排除し、一般的な変換を個別にレンダリングすることにしました。
次のようになりました。
if(enNone!=Enum) { switch(Enum) { case enOne: Value=f1(Value); break; case enTwo: Value=f2(Value); break; case enThree: Value=f3(Value); break; } Value=A*Value+B; }
すべてが素晴らしく、コードはよりコンパクトになり、コードの正確性は低下しませんでしたが、コンパイラーは
switchステートメントで列挙定数の1つが処理されないという警告を出し始めました。
警告が出ないようにプログラムしようとしています。そこで、ここで何ができるかを考え、
Duffの
デバイスを思い出して、次のようにしました。
switch(Enum) { case enNone: break; do { case enOne: Value=f1(Value); break; case enTwo: Value=f2(Value); break; case enThree: Value=f3(Value); break; }while( 0 ); Value=A*Value+B; }
警告は消えましたが、コードはサポートされていないことが判明したため、前回を賞賛した後、元のバージョンにロールバックしました。
このコードが機能するのは、
switchステートメントの C言語では、複合ステートメントの制限が非常に緩和されているため、正しく構成するだけで、
caseラベル
がステートメントの前にあるためです。
最初の
breakステートメントのみ
。 スイッチ構成を終了し、残りは
do {} whileループを終了
します 。
また、このような
スイッチ機能を使用してCでコプロセスを整理することも知っていますが、残念ながら、この機能のこのような便利なアプリケーションの例は見つかりませんでした。