【C言語】
do-while(0)を避ける理由

do-while(0) 避ける

warning: redundant continue statement at the end of loop statement

警告:ループ文の末尾にある冗長なcontinue文
[readability-redundant-control-flow]


■問題1:何と表示されるでしょうか?

//clang-tidy "-checks=*"
#include    <stdio.h>
int main(void){
    int i = 0;
    do {
        printf("%d\n",i);
        i++;
        continue;
    } while(0);
}

何と表示されるか即答できなければ
do-while(0)を使うのは止めましょう。


●解答1

0

0とだけ表示されます。


■問題2:何と表示されるでしょうか?

#include    <stdio.h>
int main(void){
    int i = 0;
    do {
        printf("%d\n",i) ;
        i++;
        if(i < 10) 
            continue;
        printf("ここに制御は来るか?\n") ;
    } while(0);
}

即答できてもリーダブルコードを読んで
do-while(0)を使うのは止めましょう。

●解答2

0

0とだけ表示されます。


■早期リターン禁止は必須から推奨に降格

do-while(0)は制御が複雑になりやすいので
極力使用を避けましょう。

エラー処理の為に
do-while(0)構文を使用する
プロジェクトも多くありますが、

【早期リターン】や
【gotoクリーンアップ】が使えないか
検討してみて下さい。

MISRA-Cルールでは以前【早期リターン禁止】は「必要」でしたが、
2012年度版では「推奨」に降格しているので、
リーダブルコードでも紹介されている
【早期リターン】の導入を検討してみて下さい。

参考:

MEM12-C. リソースの使用および解放の最中に発生するエラーが原因で関数を終了する場合に、Goto 連鎖の使用を検討する

one entry one exitの原則に関するルールの変遷MISRA-Cガイドライン入門