potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C++ do {...} while((void)0, 0)によるマクロラッピング

WIL(Windows Implementation Libraries)のソースコードを読んでいたら次のコードを見つけました。

#define BEEP_IF(condition) do { if (wil::verify_bool(condition)) { Beep(); } } while ((void)0, 0)

BEEP_IF(condition)マクロの定義、if ((condition)) ...式をわざわざdo {...} while ((void)0, 0)で囲っています。

Stack Overflowの記事などを読むとdo {...} while ((void)0, 0)の目的は大きく次の2つに分けられるようです。

  1. do {if (...) ...} while (...)
    • {...}の続かないif直後で使用された場合の式のまとめと末尾「;」の強要(剥き出しの{...}では後者が不可能)
  2. while ((void)0, 0)
    • コンパイル警告「条件式が定数」の回避(一部バージョンのMSVCなど)

昨今はマクロよりもinlineconstexprが好まれると思いますが、知識として。