我有一个用C(C89兼容)实现的库。它定义了bool数据类型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模式下的编译器没有发出警告?
答案 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
,所以那里没有混淆。