【C言語】enum では最初の定数は非ゼロにするか、あるいはエラーを示すものにする


デバッグを楽にする小技

#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;
こうすると、 初期化していない変数はしばしば自発的に「エラー」になってくれる。」