
■最初の定数を非ゼロにするとデバッグが楽になる
#include <stdio.h>
typedef enum {
Sun=1,//最初の定数を非ゼロにするとデバッグが楽になる
Mon,
Tue,
Wed,
Thu,
Fri,
Sat
} week ;
char *num2Week(week w) {
switch(w){
case Sun: return "日曜日";
case Mon: return "月曜日";
case Tue: return "火曜日";
case Wed: return "水曜日";
case Thu: return "木曜日";
case Fri: return "金曜日";
case Sat: return "土曜日";
default:
return
"未初期化変数は、"
"たまたま0である事が多いので"
"enumの先頭を非ゼロにするとバグを見つけやすい" ;
}
}
int main(void){
printf("%s\n",num2Week(Sun));
week x ; //初期化忘れのバグ
printf("%s\n",num2Week(x));
}
上記のプログラムで
enumの先頭でSun=1の設定をしていないと、
初期化していない xを引数にしてnum2Week(x)を呼んだ場合
”日曜日”が表示され(る事が多く)
問題検出が困難となる。
参考:
https://www.gfd-dennou.org/arch/comptech/cstyle/cstyle-ja.htm
から引用
「15 デバッグ
enum では、最初の定数はノンゼロにするか、 あるいはエラーを示すものにする。
enum { STATE_ERR, STATE_START, STATE_NORMAL, STATE_END } state_t;
enum { VAL_NEW=1, VAL_NORMAL, VAL_DYING, VAL_DEAD } value_t;
こうすると、 初期化していない変数はしばしば自発的に「エラー」になってくれる。」
