do...while(false)の利点は何ですか


時々こういうプログラムを見かけます

[code]

    do
    {
        if (!hoge)
            break;
        fuga();
    } while(false);
    
[/code]

これは以下のプログラムと同じではないでしょうか

[code]

    if (hoge)
    {
        fuga();
    }
    
[/code]

2つ目の書き方は1つ目の書き方よりわかりやすいしデバグしやすいと思いますが、1つ目の書き方には利点はありますか




質問に書かれているコードそのままだと do-while を用いるメリットはあまり無さそうですが、例えば「`fuga()`を実行するためには
`hoge1()` 〜 `hoge3()`
の全てに成功している必要がある」というようなケースだと利点があるように思えます。元のコードを見ていないので憶測となりますが、後々に`fuga()`を実行するための条件が増えることを考慮し、あらかじめ
do-while で囲っているのかもしれません。

[code]

    /* do-while 版 */
    do {
        if (!hoge1())
            break;
        if (!hoge2())
            break;
        if (!hoge3())
            break;
        fuga();
    } while(0);
    foobar();
    
    /* if 版 */
    if (hoge1()) {
        if (hoge2()) {
            if (hoge3()) {
                fuga();
            }
        }
    }
    foobar();
    
[/code]

goto 文が禁止されていたり使わない信条だったりすると、代用として do {} while(0) を使って書かれることもあるのかなと思います。




質問に書かれているコードそのままだと do-while を用いるメリットはあまり無さそうですが、例えば「`fuga()`を実行するためには
`hoge1()` 〜 `hoge3()`
の全てに成功している必要がある」というようなケースだと利点があるように思えます。元のコードを見ていないので憶測となりますが、後々に`fuga()`を実行するための条件が増えることを考慮し、あらかじめ
do-while で囲っているのかもしれません。

[code]

    /* do-while 版 */
    do {
        if (!hoge1())
            break;
        if (!hoge2())
            break;
        if (!hoge3())
            break;
        fuga();
    } while(0);
    foobar();
    
    /* if 版 */
    if (hoge1()) {
        if (hoge2()) {
            if (hoge3()) {
                fuga();
            }
        }
    }
    foobar();
    
[/code]

goto 文が禁止されていたり使わない信条だったりすると、代用として do {} while(0) を使って書かれることもあるのかなと思います。

