c++ - 条件表达式中的常量值

标签 c++ c warnings visual-c++

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/

相关文章:

C++数组交换并找到最小元素

c++ - 命令设计模式的实现有一些错误?

c# - 寻找 GSM 短信组件/ActiveX

ios - 在 XNU 内核上查找某个函数的指针的最佳方法是什么?

c - 从文件中读取C编程

ios - XCode 警告 : Using 'stringWithString' : with a literal is redundant

c++ - 为嵌套自定义类型定义散列函数

c - 是否可以检查变量是否为结构类型?

r - 关闭未使用的 RODBC 句柄

PHP 非法偏移类型