do {} while(0)

読み:ドゥー・なみかっこ・なみかっことじ・ホワイル・かっこ・ゼロ・かっことじ
外語:do {} while(0) 英語
品詞:名詞

C/C++で、関数を無効化する際に使われる、マクロ定義の方法の一つ。

目次

次のようなexternがあったとする(引数の型は何でも良い)。

extern void hogehoge(int, int);

これを、#if〜#else〜#endifなどの条件に応じて関数を無効にしたい場合があったとすると、条件に応じて次のようにマクロを定義する。

#define hogehoge(x, y) do {} while(0)

考え方

単に無効化するだけなら、次の方法で可能である。

#define hogehoge(x, y)

しかしこの方法は、ブロック{}で囲まれていないif文などで使用された場合、正常にコンパイルできない。

if (cond)
    hogehoge(x,y);
else
    fugafuga(x,y);

hogehoge(x,y);がそのまま;に置き換わってしまうと、else以降がエラーになる。そこで、動作しないコードを定義するようになった。

最適化

前述した以下の定義は、動作しないコードを定義する方法の一つである。

#define hogehoge(x, y) do {} while(0)

こうすると、ブロック{}で囲まれていないif文などで使用されても誤動作せず、関数の呼び出しを無効化できる。(0)の代わりに(false)などでも同様である。

また、この処理は常に1回しか実行されずしかも内容がない。従って賢いC/C++コンパイラーでは最適化によって丸ごと消滅するため、出力バイナリサイズも無駄に増えることがない。

他の方法

次のような方法でも同様に動作する。

#define hogehoge(x, y) ((void)0)

用語の所属
C/C++
関連する用語
assert

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club