在关于无限循环的编码风格问题中,有些人提到他们更喜欢 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 地狱而不必禁用该警告?或者它是一个过于宽泛的警告,一般不应该启用?