2016-01-27 12 views
5

L'avvertimento C4800 della Microsoft compilatore C++ come descritto qui:C4800 ha un valore reale?

https://msdn.microsoft.com/en-us/library/b6801kcy.aspx

rende questo codice:

// C4800.cpp 
// compile with: /W3 
int main() { 
    int i = 0; 

// try.. 
// bool i = 0; 

    bool j = i; // C4800 
    j++; 
} 

gettare l'avviso C4800: " 'tipo': forzatura valore bool 'vero "o" falso "(avviso di prestazione)"

Microsoft sembra ritenere che sia ragionevolmente importante, e lo ha come avvertimento di Livello3, tuttavia Clang sembra che non lo sia, così come non si lamenta tutto intorno a -Weverything, il suo livello massimo di avvertimento.

C'è qualche bug del mondo reale che qualcuno possa inventare che C4800 indichi che valga la pena di averlo abilitato?

+2

Leggi il testo : "avviso di prestazione". Ti avverte solo che questo potrebbe essere un po 'più lento/più costoso di quanto potresti aspettarti. –

+3

anche il degrado delle prestazioni è un errore :) puoi pensare a un caso reale in cui si verifica un degrado delle prestazioni non superflui che questo avviso potrebbe segnalare? –

+1

Se non lo hai già trovato, [questa domanda] (http://stackoverflow.com/questions/206564/what-is-the-performance-implication-of-converting-to-bool-in-c) può essere di qualche interesse per te La prima risposta sembra indicare che "l'avviso di prestazione" non è più ciò che l'avvertimento intende far notare. – jaggedSpire

risposta

3

Fondamentalmente, si tratta solo di avvertire che si sta convertendo un altro tipo di numero intero in uno bool e questa conversione non è completamente gratuita.

È principalmente presente (almeno come vedo le cose) per avvisare che stai mescolando bool s con altri tipi interi, il che non solo porta ad una minore riduzione delle prestazioni, ma può anche indicare una certa confusione nel codice. Guardando il codice nella questione:

int i = 0; 

// try.. 
// bool i = 0; 

    bool j = i; // C4800 
    j++; 

... quello che abbiamo sembra come una conversione incompleta di un codice che in precedenza definito j essere di tipo int. La definizione di j è stata modificata e ora è di tipo bool, ma assegniamo comunque un valore da uno int e (peggio) utilizzando un post-incremento su di esso, entrambi avrebbero senso se j avesse tipo int , ma in realtà non con j con tipo bool.

Quindi, la questione è se ciò che volevamo assegnare j con il risultato di un confronto: bool j = (i != 0); o forse una conversione più completo che si trasformerebbe i in un bool così:

bool i = false; 

// ... 
bool j = i; // no warning 

j = true; // cleaner way of producing the same result as the post-increment. 
Problemi correlati