2013-04-09 14 views
7

wiem, że jeśli wykonamy GCC jako takie:Jak zachowuje się GCC, jeśli przekazano sprzeczne flagi kompilatora?

gcc -O3 -O2 foo.c 

GCC użyje ostatnią flagę optymalizacji przekazana (w tym przypadku O2). Czy to prawda w przypadku wszystkich flag? Na przykład, jeśli wykonam GCC tak:

gcc -mno-sse -msse bar.c 

będzie wspierać SSE ponieważ to był ostatni flagi przekazywane lub doprowadziłoby to do niezdefiniowanej zachowanie? Moje początkowe eksperymenty zdają się wskazywać, że będzie to wspierać SSE, ale nie jestem pewien, czy jest to prawdą we wszystkich przypadkach.

Odpowiedz

10

Zwykle późniejsze opcje na override linii minęły wcześniej, jak wspominasz w swoim pierwszym przykładzie. Nie osobiście natknąłem się na inne zachowanie dla flag -m lub -f, ale nie znam konkretnego odniesienia w dokumentacji.

Należy zauważyć, że niektóre opcje nie zachowują się w ten sposób:

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

Więc nie musiałyby być -UABC pomiędzy nimi nie zamykać tego ostrzeżenia w górę.

Odkładając na bok, clang jest szczególnie dobry w rozwiązaniu tego problemu - wyświetli ostrzeżenie, jeśli zignoruje opcję wiersza poleceń, która może ci pomóc.

+3

Warto zauważyć, że gcc nadal zachowuje się w "późniejszych opcjach na override linii przejętych wcześniej", nawet w twoim przykładzie. Po prostu to * także * daje ostrzeżenie. – codetaku

Powiązane problemy