2016-01-27 11 views
5

Die C4800 Warnung in der Microsoft C++ Compiler, wie hier beschrieben:Hat C4800 einen realen Wert?

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

macht diesen Code:

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

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

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

die C4800 Warnung werfen: „ 'Typ': Wert zwingen‚true in bool "oder" false "(Leistungswarnung)"

Microsoft scheint zu glauben, dass es ziemlich wichtig ist, und hat es als Level3-Warnung, aber Clang glaubt anscheinend, dass es nicht ist, wie es bei Null ist darüber bei Weverything, seine maximale Warnstufe.

Gibt es einen wirklichen Weltfehler, den jemand finden kann, der C4800 würde darauf hinweisen, dass es sich lohnen würde, es aktiviert zu haben?

+2

Lesen Sie den Wortlaut : "Leistungswarnung" Es warnt Sie nur, dass dies etwas langsamer/teurer als Sie vielleicht erwarten. –

+3

Leistungseinbuße ist auch ein Fehler :) Können Sie sich einen realen Fall vorstellen, in dem Sie eine unnötige Leistungsverschlechterung haben, auf die diese Warnung hinweisen würde? –

+1

Wenn Sie es nicht bereits gefunden haben, [kann diese Frage] (http://stackoverflow.com/questions/206564/what-is-the-performance-implication-of-converting-to-bool-in-c) für dich von Interesse sein. Die erste Antwort scheint darauf hinzuweisen, dass die "Leistungswarnung" nicht mehr genau das ist, worauf die Warnung hinweisen soll. – jaggedSpire

Antwort

3

Im Grunde warnt Sie nur, dass Sie einen anderen Integer-Typ in eine bool konvertieren, und diese Konvertierung ist nicht völlig kostenlos.

Es ist meistens vorhanden (zumindest wie ich Dinge sehe) zu warnen, dass Sie bool s mit anderen Integer-Typen mischen, was nicht nur zu einer geringfügigen Verringerung der Leistung führt, sondern auch auf einige Verwirrung im Code hinweisen kann. Mit Blick auf den Code in der Frage:

int i = 0; 

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

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

..., was wir haben sieht wie eine unvollständige Umwandlung von Code, der zuvor j vom Typ int sein definiert. Die Definition von j wurde so bearbeitet, dass sie jetzt vom Typ bool ist, aber wir geben ihr immer noch einen Wert von int und (schlechter) mit einem Post-Inkrement darauf, was beide sinnvoll wäre, wenn j den Typ int hätte , aber wirklich nicht mit j mit Typ bool.

So ist die Frage, ob das, was wir wirklich j mit dem Ergebnis eines Vergleichs zuweisen wollte: bool j = (i != 0); oder vielleicht eine vollständigere Umwandlung, die i in eine bool verwandeln würde auch:

bool i = false; 

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

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