我得到這個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}};
感謝您的回覆。我有一個關於你的重寫的問題:'IN_TMR.Value'發生了什麼? –
對不起,週五結束了,沒有深入地看,並認爲在這兩種情況下使用相同的值。刪除 – Slava