防止Keil uVision中的布尔值“枚举类型与其他类型混合”警告

时间:2018-07-18 10:36:51

标签: c arm keil armcc

我正在将我在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的警告,而不会完全禁用有关将枚举类型与其他类型混合的警告。

这些是我可以用来配置编译器的选项:

2 个答案:

答案 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);
}

https://ideone.com/nNHPLg

您将把int值显式转换为零或一。例如:

bool x = !!something;

bool x = something ? true : false;