【发布时间】:2010-09-18 11:22:35
【问题描述】:
在coding style question about infinite loops 中,一些人提到他们更喜欢 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 地狱而不必禁用该警告?还是一般不应启用的过于宽泛的警告?
【问题讨论】:
标签: c++ c warnings visual-c++