2016-04-08 18 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

相关问题