我有一个用 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 模式下不发出警告?
您会收到警告,因为将整数与
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
,所以那里不能有混淆。