無限ループに関するコーディング スタイルの質問で、for(;;) スタイルを好むと述べた人もいました。これは、while(true) スタイルが MSVC で条件式が定数であるという警告メッセージを表示するためです。
条件式での定数値の使用は #ifdef 地獄を回避する便利な方法であるため、これには非常に驚きました。たとえば、ヘッダーに次のように記述できます。
#ifdef CONFIG_FOO
extern int foo_enabled;
#else
#define foo_enabled 0
#endif
CONFIG_FOO が定義されていない場合、コードは単純に条件を使用し、コンパイラを信頼してデッド コードを除外できます。
if (foo_enabled) {
...
}
foo_enabled が使用されるたびに CONFIG_FOO をテストする代わりに:
#ifdef CONFIG_FOO
if (foo_enabled) {
...
}
#endif
この設計パターンは、Linux カーネルで常に使用されます (たとえば、include/linux/cpumask.h は、SMP が無効な場合は 1 または 0 に、SMP が有効な場合は関数呼び出しに、いくつかのマクロを定義します)。
その MSVC 警告の理由は何ですか? さらに、その警告を無効にすることなく #ifdef 地獄を回避するより良い方法はありますか? それとも、一般的に有効にすべきではない過度に広範な警告ですか?