2013-04-09 9 views
7

Ich weiß, dass, wenn Sie GCC als solche ausführen:Wie verhält sich GCC, wenn es konkurrierende Compiler-Flags passiert?

gcc -O3 -O2 foo.c 

GCC geleitet, um die letzte Optimierung Flag (in diesem Fall O2) verwenden. Aber gilt das für alle Flaggen? Zum Beispiel, wenn ich GCC ausführen wie folgt:

gcc -mno-sse -msse bar.c 

Werde es SSE unterstützen, da dies die letzte Flagge übergeben ist, oder würde dieses Ergebnis in undefiniertem Verhalten? Meine ersten Experimente scheinen darauf hinzuweisen, dass SSE unterstützt wird, aber ich bin nicht sicher, ob dies für alle Fälle zutrifft.

Antwort

10

Normalerweise überschreiben spätere Optionen in der Zeile die zuvor übergebenen, wie Sie im ersten Beispiel erwähnt haben. Ich bin persönlich auf kein anderes Verhalten für -m oder -f Flags gestoßen, aber ich weiß nicht von einer bestimmten Referenz in der Dokumentation.

Beachten Sie, dass einige Optionen verhalten sich nicht auf diese Weise:

$ gcc example.c -DABC -DABC=12 
<command-line>: warning: "ABC" redefined 
<command-line>: warning: this is the location of the previous definition 

So würde es braucht ein -UABC dazwischen, dort zu sein, dass die Warnung zum Schweigen zu bringen.

Nebenbei eignet sich clang besonders gut zur Lösung dieses Problems - es wird eine Warnung ausgeben, wenn es eine Befehlszeilenoption ignoriert, die Ihnen helfen kann.

+3

Es ist möglicherweise erwähnenswert, dass gcc immer noch in den "späteren Optionen auf der Linie überschreiben, die zuvor bestanden" Weg, auch in Ihrem Beispiel. Es gibt nur eine Warnung. – codetaku

Verwandte Themen