【C言語】
switch文の中でreturn直後にbreakは必要か?


■1.何をしてるか1秒でわかるコードに

typedef enum { R, G, B } Color;
char    *f1(Color c) {
    switch (c) {
    case R:     return "赤";
    case G:     return "緑";
    case B:     return "青";
    default:    return "未知の色";
    }
}

caseがbreak で終わっていないので
下記2大コーディングルールに違反します。

MISRA-C:2012 R16.3 違反
CERT-C MSC17-C. 違反

※CERT-C MSC01-C 本家では break の無い例も紹介されている。

■2.ルールを守ってbreakを追加してみる

warning: ‘break’ will never be executed

警告:breakに制御は来ません

[-Wunreachable-code-break]

char    *f2(Color c) {
    switch (c) {
    case R: return "赤";    break;
    case G: return "緑";    break;
    case B: return "青";    break;
    default:    
        return "未知の色";  break;
    }
}

⇒break が五月蠅くなった。

■3.さらに関数出口一つルールに従うと

char    *f3(Color c) {
    char    *ret ;
    switch (c) {
    case R: 
        ret = "赤";         
        break;
    case G: 
        ret = "緑";         
        break;
    case B: 
        ret = "青";         
        break;
    default:
        ret = "未知の色";   
        break;
    }
    return  ret ;
}

ついでに社内ルールでよくあるマルチステートメント禁止で書くと
⇒何をしてるのか、ぱっと見わからなくなった。

■4.まとめ(杓子定規はいけない)

以上がコーディングルールを杓子定規に守って
コードを難解にした例です。

MISRA-CもCERT-Cも必須ルールではなくて、
推奨ルールなのでガチガチに遵守するのではなく
柔軟に対応するのが良いでしょう。