[C++] do~while (false)が好き

| | コメント(0) | トラックバック(0)

関数内で、do~while (false)を使うのが好き。
使う人は当たり前のように使ってるけど、この書き方が嫌いな人も結構いるっぽい。

メリットは、

  • if文の多用や、それによるインデントの数を防げる
  • 終了時の処理が分散しない(途中returnを無くせる)

ってとこだと思う。

実際↓こんな感じになる。

/**
 * なんかの初期化関数
 *
 * @param[in]    a_nIn    入力値
 *
 * @return    処理結果
 * @retval    true    成功
 * @retval    false   失敗
 */
bool Init(int a_nIn)
{
    bool    bRet = true;        // 戻り値
    char*   pszError = NULL;    // エラーメッセージ

    do
    {
        // パラメータチェック
        if (a_nIn < 0)
        {
            pszError = "パラメータエラー";
            bRet = false;
            break;
        }

        // オブジェクトの生成
        if (! CreateObject())
        {
            pszError = "オブジェクト生成エラー";
            bRet = false;
            break;
        }

        // オブジェクト2の生成
        if (! CreateObject2())
        {
            pszError = "オブジェクト2生成エラー";
            bRet = false;
            break;
        }
    }
    while (false);

    // エラーメッセージ表示
    if (! bRet)
    {
        OutputErrorMessage(pszError);
    }

    // ログ出力とか?必要なら
    OutputLog(__FUNCTION__);

    return bRet;
}

途中returnあると、終了時の処理が分散しちゃって見にくいし、管理しにくい。終了処理は一箇所にまとまってる方がいいかなと。

ちなみに、while文使って、

    while (true)
    {
        // パラメータチェック
        if (a_nIn < 0)
        {
            pszError = "パラメータエラー";
            bRet = false;
            break;
        }

        …(略)…

        break;
    }

でもいいかと思ったけど、会社の人と話したときに、

「breakは忘れるから怖い」

って言ってた。while(true)でbreak忘れて無限ループになるのが怖いと。
do~while文だったら、最後のwhile忘れたらコンパイルがそもそもできないし、その最後のwhileにfalseじゃなくて敢えてtrueを指定するって間違いは無いと思う。
でも、while文のときは、while(true)の中で最後にbreak忘れても、コンパイル通っちゃう。そのbreakだけ忘れるとかだったらやっちゃいそう。

あ、goto文は存在しないことにしときます。

トラックバック(0)

このブログ記事を参照しているブログ一覧: [C++] do~while (false)が好き

このブログ記事に対するトラックバックURL: http://blog.1122soft.com/mt4/mt-tb.cgi/54

コメントする

プロフィール

  • 1983年生まれ。
    C++、PHP、JavaScript、ActionScriptで何か作ってます。

技術書

Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
C++ Coding Standards―101のルール、ガイドライン、ベストプラクティス (C++ in‐depth series)
JavaScript 第5版
まるごとJavaScript & Ajax ! Vol.1
CakePHPガイドブック
CakePHP ポケットリファレンス (Pocket Reference)
Powered by Movable Type 4.01

このブログ記事について

このページは、1122が2008年5月11日 22:50に書いたブログ記事です。

ひとつ前のブログ記事は「[C++] コンストラクタの初期化リストと配列」です。

次のブログ記事は「[C/C++] エンディアンに苦しめられた」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

2008年10月

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

リンク