2016-04-08 64 views
0

我得到這個C4800警告,它指向的代碼行有與之關聯的INT值:爲什麼我得到「C4800:'int':強制值爲bool」與所有bool值?

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

.Value屬性是bool類型。

我正在使用VS2015,C++/CLI,並且在我的代碼中沒有找到對win32類型BOOL的引用,儘管我派生了我自己的類型BOOL,從這些BOOL中轉換了每個屬性。

我在這個項目中有200多個其他.cpp文件,其中有幾千行類似的代碼,但我只在這個確切的行中得到這個警告。

這更多的不是一個值得關注的好奇心,我可以很容易地擺脫錯誤的使用邏輯運算符(見下文),但如果任何人有任何想法,我喜歡聽到他們的聲音。我沒有發佈之前搜索這個錯誤,但一直沒有得到滿意的答覆(主要是人在使用int類型,並具有鑄造問題是。)

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

三線下來,我這一行:

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 我做了一些測試,發現儘管看起來不太可能,但這行代碼甚至在我的許多其他數十行代碼中都是獨一無二的。這只是一個僅僅使用算術運算符的問題。我認爲是類似的所有其他行有某種在他們的邏輯運算符(算術混合)的

這似乎是該行的這一部分:

(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警告,它指向的代碼行有與之

位運算相關的NO INT值arithmetic operators和布爾操作數隱式轉換爲int由於integral promotionint類型的操作數的算術運算符的結果也是int

至於爲什麼MS編譯器在一種情況下會產生這樣的警告,而在其他情況下不會產生這種警告我只能猜測它只能在某些情況下預測值。

+0

感謝您的回覆。我有一個關於你的重寫的問題:'IN_TMR.Value'發生了什麼? –

+0

對不起,週五結束了,沒有深入地看,並認爲在這兩種情況下使用相同的值。刪除 – Slava