2016-04-08 15 views
0

Bu C4800 uyarısı alıyorum ve onunla ilişkili YOK int değerlerine sahip bir kod satırına işaret:Neden "C4800: 'int': boole değerini zorlamak" ALL bool değerleriyle oluyor?

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

Her .Value özellik türü bool taşımaktadır.

VS2015, C++/CLI kullanıyorum ve bu özelliklerin her birinin yayınlandığı kendi türümü BOOL türettiğim halde, kodumu win32 türünde BOOL için hiçbir başvuru bulamadım.

Bu projede 200'den fazla diğer .cpp dosyam var ve bu kod binlerce satırlık kod içeriyor, ancak bu uyarıyı yalnızca bu satır için aldım.

bir endişe daha merakı bu daha

, kolayca mantıksal (aşağıya bakınız) operatörlerini kullanarak hata kurtulmak, ancak herkes herhangi bir fikir varsa onları duymak ister. Ben göndermeden önce bu hatayı arama yaptı, ama (çoğunlukla insanlar int türlerini kullanarak ve döküm sorunlarınız EDİLDİ.)

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

Üç satır aşağı ben bu satırı var tatmin edici bir cevap aldım:

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;} 
}; 
: hiç uyarı alır

... İşte dahil kod daha tam listesi

...

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; 
    } 
} 

GÜNCELLEME Bazı testler yaptım ve göründüğü kadar az olduğu gibi, bu kod satırı benim binlerce diğer 10 kod satırım arasında bile benzersizdi. Sadece SADECE aritmetik operatörlerini kullanma meselesiydi.Ben de benzer düşünce Diğer tüm hatlar (aritmetik karışmış) onlarda mantıksal operatör çeşit vardı

Yolun bu bölümü gibi görünen

: yani aritmetik çünkü

(GE_DUAL.Value & GE_SINGLE.Value) ===> int 

ve diğer parçası mantıklıdır:

(!GE_DUAL.Value & !IN_TMR.Value) ===> bool 

bütün çizgi dolaylı int döküm şöyle ki:

(GE_DUAL.Value & GE_SINGLE.Value) | (!GE_DUAL.Value & !IN_TMR.Value) 

{bool} != {{int} | {bool}}; 
{int} == {{int} | {bool}}; 

cevap

1

Bu C4800 uyarısı alıyorum ve bunun

Bit operasyonları ile ilişkili YOK int değerlerine sahip bir kod satırına işaret arithmetic operators ve boole işlenenler örtülü integral promotion nedeniyle int dönüştürülür. int tipindeki işlenenlerin aritmetik operatörünün sonucu da int'dur. MS derleyici bir vakada böyle uyarılar üretir ve sadece bazı durumlarda değer tahmin yalnızca ki tahmin edebilirsiniz diğerlerinde yok neden gelince

.

+0

Cevabınız için teşekkür ederiz. Yeniden yazmanız hakkında bir sorum var: IN_TMR.Value'ye ne oldu? Cuma ait –

+0

Ah üzgünüm uç derin bakmak ve her iki durumda da aynı değerlere kullanılan düşündüm vermedi. Kaldırılan – Slava

İlgili konular