warning: enumeration value ‘x’ not handled in switch
警告:列挙値 ‘x’ がswitch文で処理されません。
[-Wswitch]
■1.case 桃太郎:を忘れた?
#include <stdio.h>
typedef enum {
桃太郎,犬,猿,雉,
} 桃組;
char *鳴き声(桃組 家来){
switch(家来){
case 犬: return "ワンワン" ;
case 猿: return "ウキーッ" ;
case 雉: return "ケーン";
}
}
int main(void){
printf("%s\n",鳴き声(犬));
printf("%s\n",鳴き声(猿));
printf("%s\n",鳴き声(雉));
printf("%s\n",鳴き声(桃太郎));
}
最近のコンパイラはswitch(enum式)と記述すると
case の抜けを指摘してくれます。
enum型の全てのメンバーがcase 文に記述されているか、
default節が記述されているか、
確認してください。
■2./*何もしない*/追加だけでは不十分
#include <stdio.h>
typedef enum {
桃太郎,犬,猿,雉,
} 桃組;
char *鳴き声(桃組 家来){
switch(家来){
case 犬: return "ワンワン" ;
case 猿: return "ウキーッ" ;
case 雉: return "ケーン";
case 桃太郎:
default:
; //何もしない
}
}
/*何もしない*/だけでは正常経路か異常経路かわかりません。
■3.桃太郎他を正常経路と明示する(推奨)
#include <stdio.h>
#include <assert.h>
typedef enum {
桃太郎,犬,猿,雉,
} 桃組;
char *鳴き声(桃組 家来){
switch(家来){
case 犬: return "ワンワン" ;
case 猿: return "ウキーッ" ;
case 雉: return "ケーン";
case 桃太郎:
default:
//ここにも制御が来るが、何もせず下へ行く
}
return "";//想定外は無言を返す
}
制御が来る事を明示するコメントを記述する。
■4.桃太郎他を異常経路と明示する(推奨)
#include <assert.h>
#include <stdio.h>
typedef enum {
桃太郎,犬,猿,雉,
} 桃組;
char *鳴き声(桃組 家来){
switch(家来){
case 犬: return "ワンワン" ;
case 猿: return "ウキーッ" ;
case 雉: return "ケーン";
case 桃太郎:
default:
//ここには制御は来ない、来たらBUG
assert(0);//想定外検出
}
}
制御が来ない事を明示するコメントを追加し、
プログラムの種類に応じて assert()や、エラー時処理を追加する。
参考:
MSC01-C. 論理的な完全性を追求する
https://www.jpcert.or.jp/sc-rules/c-msc01-c.html