我正在将我在CodeWarrior v5.2中开发的应用程序迁移到使用ARM C编译器v5.06的Keil uVision v5.25。
在我的代码中,我一直使用bool
来表示布尔值,该值在项目的types.h
文件中定义为:
typedef enum _bool
{
false = 0,
true = 1
} bool;
当我尝试编译代码时,编译器会生成关于行的警告,这些行将比较结果隐式分配给以下类型的变量:
src\c\drivers\motor.c(168): warning: #188-D: enumerated type mixed with another type
const bool motorStopped = timeSinceLastEvent > maxPulseWidth;
src\c\drivers\motor.c(169): warning: #188-D: enumerated type mixed with another type
const bool motorStalled = motorStopped && isMotorDriven();
我了解为什么会生成这些警告。我知道我可以通过显式转换为bool
来抑制这些警告,例如:
const bool motorStopped = (bool)(timeSinceLastEvent > maxPulseWidth);
但是,对于每个布尔条件执行此操作都很难。我想知道是否有一种方法可以配置Keil uVision / ARM编译器(或修改我的代码),以不生成关于bool
的警告,而不会完全禁用有关将枚举类型与其他类型混合的警告。
这些是我可以用来配置编译器的选项:
答案 0 :(得分:1)
感觉很脏,但是我通过修改SDK套件随附的types.h
文件来解决此问题,方法是使其包含stdbool.h
而不是定义自己的bool
类型。重新编译我的项目在使用bool
的第三方代码或我自己的代码中均未产生警告/错误。
出于良好的考虑,我尝试以某种方式对其进行修改,如果它是在C89项目中编译的,则该方式应该仍然可以使它工作:
#if __STDC_VERSION__ >= 199901L
#include <stdbool.h>
#endif
// ...
#if __STDC_VERSION__ < 199901L
typedef enum _bool
{
false = 0,
true = 1
} bool;
#endif
答案 1 :(得分:-2)
首先,这类定义在C语言中在逻辑上不正确。
C将false
定义为零,并将true
定义为非零,当然,其中包括1,但不仅限于此。在许多情况下可能很危险:
仅当函数的返回值为if(GetValue() == true)
时,表达式1
的值为true。这是非常危险的,并且可能是许多难以发现的错误的来源。
bool
可以具有任何值,因为int
是其后面的类型。
铸造不做任何改变:
#include <stdio.h>
#include <string.h>
typedef enum _bool
{
false = 0,
true = 1
} bool;
int main(void) {
bool x;
x = 50;
printf("%d\n", x);
x = (bool)50;
printf("%d\n", x);
}
您将把int值显式转换为零或一。例如:
bool x = !!something;
bool x = something ? true : false;