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