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つに分けられるようです。
do {if (...) ...} while (...)
{...}
の続かないif
直後で使用された場合の式のまとめと末尾「;」の強要(剥き出しの{...}
では後者が不可能)
while ((void)0, 0)
- コンパイル警告「条件式が定数」の回避(一部バージョンのMSVCなど)
昨今はマクロよりもinline
やconstexpr
が好まれると思いますが、知識として。