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

问题描述 投票:0回答:1

我有一个用 C 实现的库(C89兼容)。它定义了布尔数据类型

bool32
。它还定义了布尔文字
TRUE
FALSE
:

#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
比较不会产生警告。

我还检查了预处理文件,以确保使用上述

TRUE
FALSE
的定义,而不是其他定义。这个看起来还可以。

是否有解释为什么警告仅发生在

TRUE
以及如何避免此警告?还有一个问题:为什么编译器在 C 模式下不发出警告?

c++ c visual-studio-2010 compiler-warnings
1个回答
9
投票

您会收到警告,因为将整数与

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 是整数还是布尔值,这都是一个问题,只是当 TRUE 是整数时,编译器无法正确检测到它。

问题的存在是因为有几个整数值被认为是真的。只有一个值被认为是 false,

0
,所以那里不能有混淆。

© www.soinside.com 2019 - 2024. All rights reserved.