ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
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)
コメントなどを投稿するフォームは、日本語対応時のみ表示されます