2016-04-08 14 views
0

私はこのC4800の警告を取得していますし、それに関連付けられたint型の値を持っていないコードの行を指す:なぜ私は "C4800: 'int':値をすべてbool値に強制するのですか?

CO.Value = (GE_DUAL.Value & GE_SINGLE.Value) | (!GE_DUAL.Value & !IN_TMR.Value); 

すべて.Valueプロパティは、タイプboolです。

VS2015、C++/CLIを使用していて、私のコードでwin32タイプBOOLへの参照が見つかりませんでしたが、これらの各プロパティがキャストされた独自のタイプBOOLが派生しました。

私はこのプロジェクトの中に何千もの類似したコードを含む200個以上のファイルを持っていますが、私はこの正確な行について警告を出しています。懸念よりも好奇心の

これ以上は、私は簡単に(下記参照)の論理演算子にを使用してエラーを取り除くことができますが、誰もが、私はそれを聞きたい任意のアイデアを持っている場合。私は投稿する前にこのエラーを検索しましたが、(ほとんどの人がint種類を使用し、キャストの問題を持った。)

CO.Value = (GE_DUAL.Value && GE_SINGLE.Value) || (!GE_DUAL.Value && !IN_TMR.Value); 

3つのラインダウン私はこのライン持って満足のいく答えを得たことはありません:

DUAL.Value = GE_DUAL.Value & !IN_TMR.Value; 
を何の警告を取得していない

... はここ関与コードの完全なリストです:

public ref class BOOL : IPS::Properties::Bool 
{ 
public: 
    BOOL() : Bool() {} 
    BOOL(bool val) : Bool() { Value = val;} 
    operator bool() { return (bool)ValueAsObject;} 
    BOOL(BOOL% b) { m_Value = b.m_Value;} 
}; 

...

BOOL^    m_IN_TMR; 
    BOOL^    m_GE_DUAL; 
    BOOL^    m_GE_SINGLE; 
    BOOL^    m_CO; 

...

virtual property BOOL% IN_TMR 
    { 
    BOOL% get(); 
    void set(BOOL% val); 
    } 
    virtual property BOOL% GE_DUAL 
    { 
    BOOL% get(); 
    void set(BOOL% val); 
    } 
    virtual property BOOL% GE_SINGLE 
    { 
    BOOL% get(); 
    void set(BOOL% val); 
    }  
    virtual property BOOL% CO 
    { 
    BOOL% get(); 
    void set(BOOL% val); 
    } 

...

​​

...

CO.Value = CI.Value; 
if (CI.Value) 
{ 
    CO.Value = (GE_DUAL.Value & GE_SINGLE.Value) | (!GE_DUAL.Value & !IN_TMR.Value); // Warning C4800?? 
    if (CO.Value) 
    { 
    TMR.Value = IN_TMR.Value; 
    DUAL.Value = GE_DUAL.Value & !IN_TMR.Value; 
    SINGL.Value = GE_SINGLE.Value & !GE_DUAL.Value; 
    ZERO.Value = ! GE_SINGLE.Value; 
    } 
    else 
    { 
    U.Value = ReportBadParam(0); 
    TMR.Value = false; 
    DUAL.Value = false; 
    SINGL.Value = false; 
    ZERO.Value = false; 
    } 
} 

UPDATE 私はいくつかのテストを行い、見た目のようなことではないことがわかりました。このコード行は、他の多くの10のコードの中でも一意でした。単に算術演算子を使用するだけの問題でした。私は類似していたと思った他のすべての行は、(算術と混在)、それらの論理演算子のいくつかの並べ替えを持っていた

ラインのこの部分のように見える:

(GE_DUAL.Value & GE_SINGLE.Value) ===> int 

ことは、算術、およびその他であるため、一部は論理的である:全体行その

(!GE_DUAL.Value & !IN_TMR.Value) ===> bool 

暗黙的にint型にキャストされます。

(GE_DUAL.Value & GE_SINGLE.Value) | (!GE_DUAL.Value & !IN_TMR.Value) 

{bool} != {{int} | {bool}}; 
{int} == {{int} | {bool}}; 

答えて

1

私はこのC4800の警告を取得していますし、それはそれ

ビットごとの演算に関連したint型の値を持っていないコードの行にポイントがarithmetic operatorsであり、ブールオペランドは、暗黙的にintegral promotionによるintに変換されます。タイプintのオペランドの算術演算子の結果もintです。

MSコンパイラがそのような警告を1つのケースで生成する理由と、他のケースでは、一部の状況でしか値を予測できないことがわかります。

+0

返信いただきありがとうございます。あなたの書き直しに関する質問があります: 'IN_TMR.Value'はどうなりましたか? –

+0

ああ、申し訳ありませんが金曜日の終わり、深く見ていないと両方のケースで同じ値を使用していたと思った。削除済み – Slava

関連する問題