为什么我得到的是 "C4800: 'int': forcing value to bool" 所有 bool 值?
Why am I getting "C4800: 'int': forcing value to bool" with ALL bool values?
我收到此 C4800 警告,它指向一行没有与之关联的 int 值的代码:
CO.Value = (GE_DUAL.Value & GE_SINGLE.Value) | (!GE_DUAL.Value & !IN_TMR.Value);
每个 .Value
属性 都是 bool
类型。
我正在使用 VS2015、C++/CLI,并且在我的代码中没有发现对 win32 类型的引用 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);
}
...
void _TR_VOTE_MODE::IN_TMR::set(BOOL% val)
{
m_IN_TMR = %val;
}
BOOL% _TR_VOTE_MODE::GE_DUAL::get()
{
return *m_GE_DUAL;
}
void _TR_VOTE_MODE::GE_DUAL::set(BOOL% val)
{
m_GE_DUAL = %val;
}
BOOL% _TR_VOTE_MODE::GE_SINGLE::get()
{
return *m_GE_SINGLE;
}
void _TR_VOTE_MODE::GE_SINGLE::set(BOOL% val)
{
m_GE_SINGLE = %val;
}
BOOL% _TR_VOTE_MODE::CO::get()
{
return *m_CO;
}
...
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;
}
}
更新
我做了一些测试,发现这行代码即使在我的其他 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}};
I am getting this C4800 warning and it points to a line of code that has NO int values associated with it
位运算为arithmetic operators and boolean operands are implicitly converted to int
due to integral promotion。 int
类型操作数的算术运算结果也是 int
.
至于为什么 MS 编译器在一种情况下会生成此类警告而在其他情况下不会,我只能猜测它只能在某些情况下预测值。
我收到此 C4800 警告,它指向一行没有与之关联的 int 值的代码:
CO.Value = (GE_DUAL.Value & GE_SINGLE.Value) | (!GE_DUAL.Value & !IN_TMR.Value);
每个 .Value
属性 都是 bool
类型。
我正在使用 VS2015、C++/CLI,并且在我的代码中没有发现对 win32 类型的引用 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);
}
...
void _TR_VOTE_MODE::IN_TMR::set(BOOL% val)
{
m_IN_TMR = %val;
}
BOOL% _TR_VOTE_MODE::GE_DUAL::get()
{
return *m_GE_DUAL;
}
void _TR_VOTE_MODE::GE_DUAL::set(BOOL% val)
{
m_GE_DUAL = %val;
}
BOOL% _TR_VOTE_MODE::GE_SINGLE::get()
{
return *m_GE_SINGLE;
}
void _TR_VOTE_MODE::GE_SINGLE::set(BOOL% val)
{
m_GE_SINGLE = %val;
}
BOOL% _TR_VOTE_MODE::CO::get()
{
return *m_CO;
}
...
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;
}
}
更新 我做了一些测试,发现这行代码即使在我的其他 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}};
I am getting this C4800 warning and it points to a line of code that has NO int values associated with it
位运算为arithmetic operators and boolean operands are implicitly converted to int
due to integral promotion。 int
类型操作数的算术运算结果也是 int
.
至于为什么 MS 编译器在一种情况下会生成此类警告而在其他情况下不会,我只能猜测它只能在某些情况下预测值。