2

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);

ただし、ブール条件ごとにこれを行うのはかなり見苦しいです。bool列挙型と他の型の混合に関する警告を完全に無効にすることなく、Keil uVision / ARM コンパイラを構成 (またはコードを変更) して警告を生成しないようにする方法があるかどうか疑問に思っていました。

これらは、コンパイラを構成するために使用できるオプションです。

4

2 に答える 2

-2

まず第一に、この種の定義は C では論理的に正しくありません。

Cはfalseゼロとゼロでtrueはないことを定義します。これにはもちろん1が含まれますが、それだけではありません。多くの状況で危険な場合があります。

if(GetValue() == true)関数の戻り値が である場合にのみ、式は true として評価されます1。これは非常に危険であり、発見が困難な多くのエラーの原因となる可能性があります。

boolintその背後にある型と同様に、任意の値を持つことができます。

キャストしても何も変わりません:

#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 値を明示的にゼロまたは 1 に変換します。例えば:

bool x = !!something;

bool x = something ? true : false;

于 2018-07-18T10:56:44.643 に答える