仅当将值与TRUE比较时,xxx和bool的不安全混合操作警告

时间:2014-10-15 09:43:08

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

我有一个用C(C89兼容)实现的库。它定义了bool数据类型bool32。它还定义了布尔文字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> [文件名/行]:警告C4805:' ==' :不安全的混合类型' bool32'并键入' bool'在运作中

但仅适用于TRUE比较。 FALSE比较不会产生警告。

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

是否有人解释为什么仅在TRUE上发出警告以及如何避免此警告?另一个问题:为什么C模式下的编译器没有发出警告?

1 个答案:

答案 0 :(得分:8)

您收到警告,因为将整数与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既不是真也不是假!

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

存在问题是因为有几个整数值被认为是真的。只有一个值被认为是假的,0,所以那里没有混淆。

相关问题