c++ - 仅当将值与 TRUE 进行比较时才会警告操作中 xxx 和 bool 的不安全混合

标签 c++ c visual-studio-2010 compiler-warnings

我有一个用 C(C89 兼容)实现的库。它定义了一个 bool 数据类型 bool32。它还定义了 bool 文字 TRUEFALSE:

#ifndef TRUE
# define TRUE  (0 == 0)
#endif

#ifndef FALSE
# define FALSE (0 != 0)
#endif

typedef uint32_t bool32;

像下面这样的 C 代码编译时没有警告:

bool32 h = TRUE;
if(h==TRUE){
}
if(h==FALSE){
}

cpp 中的相同代码编译时出现以下警告:

1>[filename/line): warning C4805: '==' : unsafe mix of type 'bool32' and type 'bool' in operation

但仅针对 TRUE 比较。 FALSE 比较不会产生警告。

我还检查了预处理文件以确保使用了上述 TRUEFALSE 的定义,而不是另一个。这看起来不错。

有没有人能解释为什么警告只发生在 TRUE 上以及如何避免这个警告?还有一个问题:为什么 C 模式下的编译器不发出警告?

最佳答案

您收到警告是因为将整数与 bool 进行比较容易出错。

考虑以下几点:

bool32 x = 3;

if (x == FALSE) {
  printf("x is false\n");
} 
else if (x == TRUE) {
  printf("x is true\n");
} 
else {
  printf("x is neither true nor false!\n");
}

输出:

x is neither true nor false!

请注意,无论 TRUE/FALSE 是整数还是 bool 值,这都是一个问题,只是当 TRUE 是整数时,编译器无法正确检测到它。

问题存在是因为有几个整数值被认为是真的。只有一个值被认为是 false,即 0,因此那里不能混淆。

关于c++ - 仅当将值与 TRUE 进行比较时才会警告操作中 xxx 和 bool 的不安全混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26379294/

相关文章:

c++ - 有关读取有效的c++项目4的问题(用局部静态变量替换非局部静态变量)

c++ - 如何拆分范围内的字符串?

c++ - *v8::String::Utf8Value(args[0]->ToString()) 不返回 node.js 插件参数的字符串

c - 图数据结构在C中的实现

c++ - 将图标添加到工具栏中的 QAction

unit-testing - 与 2010 相比的代码覆盖率

c++ - 函数参数中 & 和 * 的区别

c - 在 C 中迭代 Char 数组元素

c - 如何返回线的长度?

c# - Visual Studio 应用程序中有两个以上的主要方法?