[英]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);
}
您將把int值顯式轉換為零或一。 例如:
bool x = !!something;
bool x = something ? true : false;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.