我有一个用 C(C89 兼容)实现的库。它定义了一个 bool 数据类型 bool32
。它还定义了 bool 文字 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>[filename/line): warning C4805: '==' : unsafe mix of type 'bool32' and type 'bool' in operation
但仅针对 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 is neither true nor false!
请注意,无论 TRUE/FALSE 是整数还是 bool 值,这都是一个问题,只是当 TRUE 是整数时,编译器无法正确检测到它。
问题存在是因为有几个整数值被认为是真的。只有一个值被认为是 false,即 0
,因此那里不能混淆。
关于c++ - 仅当将值与 TRUE 进行比较时才会警告操作中 xxx 和 bool 的不安全混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26379294/