2012-01-12 15 views
84

Zastanawiam się tylko, co robi flaga -fpermissive w kompilatorze g ++? Dostaję:Co robi flaga fermeny?

error: taking address of temporary [-fpermissive]

które można rozwiązać poprzez nadanie flagę -fpermissive do kompilatora.

EDYTOWANIE: Właśnie znalazłem przyczynę części błędu adresu tymczasowego! Zamierzam teraz naprawić tę część.

Odpowiedz

106

Od the docs:

-fpermissive
Downgrade some diagnostics about nonconformant code from errors to warnings. Thus, using -fpermissive will allow some nonconforming code to compile.

Konkluzja: nie używać, chyba że wiesz co robisz!

38

-fpermissive flag powoduje, że kompilator zgłasza pewne rzeczy, które w rzeczywistości są błędami (ale są dozwolone przez niektóre kompilatory) jako ostrzeżenia, aby zezwolić na kompilację kodu, nawet jeśli nie jest zgodny z regułami języka. Naprawdę powinieneś naprawić podstawowy problem. Opublikuj najmniejszą, możliwą do kompilacji próbkę kodu, która demonstruje problem.

-fpermissive
Downgrade some diagnostics about nonconformant code from errors to warnings. Thus, using -fpermissive will allow some nonconforming code to compile.

13

Po napisaniu czegoś, co nie jest dozwolone przez standard językowy (i dlatego nie może być dobrze zdefiniowanym zachowaniem, co jest wystarczającym powodem, aby tego nie robić), ale dzieje się z mapą do pewnego rodzaju rodzaju z pliku wykonywalnego, jeśli zostanie on naiwny do kompilatora, wtedy -fpermissive zrobi to, zamiast zatrzymywać się z tym komunikatem o błędzie. W niektórych przypadkach program zachowuje się dokładnie tak, jak pierwotnie zamierzałeś, ale zdecydowanie nie powinieneś polegać na nim, chyba że masz jakiś szczególny powód, aby nie używać innego rozwiązania.

+1

Coś, co nie jest dozwolone przez standard językowy, może być dobrze zdefiniowane. W rzeczywistości prawie każdy kompilator ma dobrze zdefiniowane rozszerzenia. Nie mówię, że tak jest w przypadku wszystkich instancji zezwalających – MikeMB

4

Jeśli chcesz użyć tego w prawdziwym świecie, spróbuj skompilować bardzo starą wersję X Windows - powiedzmy XFree86 lub XOrg od roku 2004, dokładnie wokół podziału - używając "nowoczesnego" (kaszel) wersja gcc, na przykład 4.9.3.

Zauważysz, że CFLAGS kompilacji określają zarówno "-ansi", jak i "-pedantic". Teoretycznie oznacza to "wysadzenie w powietrze, jeśli coś nawet nieznacznie narusza specyfikację językową". W praktyce gxc z serii 3.x nie przechwycił zbyt wiele tego typu rzeczy, a zbudowanie go w wersji 4.9.3 pozostawia otwór do palenia w gruncie, chyba że ustawisz CFLAGS i BOOTSTRAPCFLAGS na "-firmatywny".

Używając tej flagi, większość z tych plików C zostanie zbudowana, pozostawiając ci swobodę przejścia do zależnego od wersji wraku, który wygeneruje lexer. =]