【C言語】
switch文のdefault節で
何もしない時のコーディング作法

/* 何もしない */ 来ないはずの default節に assert(!”来ない“);

■/*何もしない*/と書くだけでは駄目

#include <stdio.h>
typedef enum    {   
    犬=1,猿,雉,
    桃太郎=101,鬼
} 桃組家来 ;
const char *鳴き声(桃組家来 x){
    const   char    *ret = "" ;
    switch(x){
    case    犬: ret = "ワンワン";   break;
    case    猿: ret = "ウッキー";   break;
    case    雉: ret = "ケーン";     break;
    default :
            ;/*何もしない*/
    }
    return  ret;
}
int main(void){
    puts(鳴き声(犬));
    puts(鳴き声(猿));
    puts(鳴き声(雉));
    puts(鳴き声(鬼));  
    puts(鳴き声(桃太郎));
}

/*何もしない*/とか
/*Do nothing*/では
正常経路か
異常経路か
よくわからないので
せっかくコメントを書いても
あまり役に立ちません。

このコードの場合、鬼や桃太郎が来るのは
正常経路でしょうか?
異常経路でしょうか?


■default節が正常経路の場合の作法

#include <stdio.h>
typedef enum    {   
    犬=1,猿,雉,
    桃太郎=101,鬼
} 桃組家来 ;
const char *鳴き声(桃組家来 x){
    const   char    *ret = "" ;
    switch(x){
    case    犬: ret = "ワンワン";   break;
    case    猿: ret = "ウッキー";   break;
    case    雉: ret = "ケーン";     break;
    default :
            ;//ここにも制御が来るが、何もせず下へ行く
    }
    return  ret;
}
int main(void){
    puts(鳴き声(犬));
    puts(鳴き声(猿));
    puts(鳴き声(雉));
    puts(鳴き声(鬼));  
    puts(鳴き声(桃太郎));
}

制御が来る事を明示するコメントを記述して下さい。


■default節が異常経路の場合の作法

#include <stdio.h>
#include <assert.h>
typedef enum    {   
    犬=1,猿,雉,
    桃太郎=101,鬼
} 桃組家来 ;
const char *鳴き声(桃組家来 x){
    const   char    *ret = "" ;
    switch(x){
    case    犬: ret = "ワンワン";   break;
    case    猿: ret = "ウッキー";   break;
    case    雉: ret = "ケーン";     break;
    default :
            assert(!"ここには制御は来ない、来たらBUG");
    }
    return  ret;
}
int main(void){
    puts(鳴き声(犬));
    puts(鳴き声(猿));
    puts(鳴き声(雉));
    puts(鳴き声(鬼));  
    puts(鳴き声(桃太郎));
}

制御が来ない事を明示するコメントや
assert()を追加して下さい。

試験でプログラムに問題がある時,
assert()は即時に異常終了してくれるので
問題をみつけやすいです。

出荷時は
gcc -DNDEBUG のようにコンパイルし
assert()を無効化しますが
そうすると
出荷後の問題は見つけれないので
悩ましいです。

製品の種類に応じて
assert()ではなくて
ログを取る独自処理等も検討してください。

参考:

MSC11-C. 診断テストはアサートを使って組み込む