我有一个用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模式下的编译器不警告?
您会收到警告,因为将整数与a进行比较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是整数时,编译器无法正确检测到它。
存在问题是因为有多个整数值被认为是true。只有一个值被认为是false 0
,因此那里不可能有任何混淆。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句