簡體   English   中英

防止Keil uVision中的布爾值出現“枚舉類型與其他類型混合”警告

[英]Prevent “enumerated type mixed with another type” warnings for boolean values in Keil uVision

我正在將使用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警告,而不會完全禁用關於將枚舉類型與其他類型混合使用的警告。

這些是我可以用來配置編譯器的選項:

感覺很臟,但是我通過修改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

首先,此類定義在C語言中在邏輯上不正確。

C將false定義為零,將true定義為非零,其中當然包括1,但不僅限於此。 在許多情況下可能很危險:

if(GetValue() == true)函數的返回值為1 ,則表達式if(GetValue() == true)為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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM