在 coding style question about infinite loops 中,有些人提到他们更喜欢 for(;;) 样式,因为 while(true) 样式会在 MSVC 上给出有关条件表达式为常量的警告消息。
这让我大吃一惊,因为在条件表达式中使用常量值是避免#ifdef hell 的有效方法。例如,您可以在标题中包含:
#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 hell 而不必禁用该警告?或者这是一个过于宽泛的警告,通常不应启用?
最佳答案
警告并不自动意味着代码不好,只是看起来可疑。
就我个人而言,我从启用所有可能的警告开始,然后关闭任何被证明比有用更烦人的警告。每当您将任何内容转换为 bool 值时都会触发的那个通常是第一个触发的。
关于c++ - 条件表达式中的常量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/224421/