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


■この記事の概要

C言語において、switch文内でのreturn後にbreak文を記述する必要性を検討し、コードの可読性向上のためのベストプラクティスを解説。

実行されないbreak文を省略し、効率的なコードの書き方を示します。


■何をしてるか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 の無い例も紹介されている。

■ルールを守って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 が五月蠅くなった。

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

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 ;
}

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

■つまり杓子定規はいけない

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

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