2013-05-22 5 views
7

Betrachten Sie den folgenden Code ein:Warum markiert clang oder gcc diese implizite Konvertierung von double in int nicht?

void f(int x) 
{ 
    std::cout << x << std::endl; 
} 

int main() 
{ 
    double x = 1.5; 
    f(x); 
    return 0; 
} 

Dies kompiliert und läuft ohne Warnungen (mit -Wall) und daher verbirgt sich eine gefährliche implizite Umwandlung von Doppel in int. Der Compiler wird die Umwandlung abfangen, wenn die Funktion mit einem Literal aufgerufen wird, d. H. Das ist nicht besonders nützlich. Warum warnen diese Compiler nicht für diese Besetzung? Ich bin auf OSX 10.8.3 mit gcc-4.2.1 und clang-425.0.28.

+2

Es gibt das '-Wconversion'-Flag, aber das wird nur von gcc 4.3 unterstützt. –

+0

Das funktionierte tatsächlich (unter Klirren) - warum sollte diese Flagge nicht in -Wall enthalten sein? – giogadi

+0

Es kann Warnungen für gültigen Code erzeugen, und es gibt eine Menge Code, der implizite Konvertierungen verwendet. –

Antwort

9

für die Nachwelt:

Um implizite Konvertierungen zu vermeiden, verwenden Sie die -Wconversion Flagge (es ist nicht in -Wall enthalten). Clang enthält tatsächlich -Weconversion in der Weverything-Flagge, aber dieses Flag ermöglicht wesentlich mehr Warnungen, als die meisten Benutzer gewohnt sind.

Verwandte Themen