我得到这个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