Co robi flaga fpermissive?

121

Zastanawiam się tylko, co -fpermissiverobi flaga w kompilatorze g ++? Staje się:

błąd: przyjmowanie adresu tymczasowego [-fdopuszczalne]

które mogę rozwiązać, podając -fpermissiveflagę kompilatorowi.

EDYCJA : Właśnie znalazłem, co powoduje tymczasową część błędu adresu! Teraz naprawię tę część.

mmirzadeh
źródło

Odpowiedzi:

146

Bezpośrednio z dokumentów :

-fpermissive
Obniż część diagnostyki niezgodnego kodu z błędów do ostrzeżeń. W związku z tym użycie -fpermissivepozwoli na kompilację niezgodnego kodu.

Podsumowując: nie używaj go, chyba że wiesz, co robisz!

cli_hlt
źródło
5
Oczekuję więcej informacji niż cytując podręcznik + „nie używaj go, dopóki nie wiesz, co robisz” od najwyżej ocenionej odpowiedzi. Nie muszę w tym celu wyszukiwać w Google. Które przypadki niezgodnego kodu są dokładnie obniżane?
johannes_lalala
Niezgodny kod jest obniżany, ale diagnostyka obejmuje błędy i ostrzeżenia. Przykład podaje osoba otwierająca pytania. Jeśli nie wiesz, jakie mogą być przypadki skrajne, nie powinieneś rozważać jego używania.
cli_hlt
2
Przepraszam stary, bez obrazy, ale rada typu „nie rób czegoś, jeśli nie znasz konsekwencji” jest banalna i pasuje do każdego pytania i nie odpowiada na żadne.
johannes_lalala
3
.. i przepraszam, ale samo cytowanie instrukcji bez jej rozwinięcia nie jest pomocne. Zwłaszcza w przypadku, gdy podręcznik jest bardzo rzadki.
johannes_lalala
50

-fpermissiveFlaga powoduje kompilator zgłosić pewne rzeczy, które są rzeczywiście błędy (ale są dopuszczone przez niektóre kompilatory) jako ostrzeżenia, aby kod zezwolenia skompilować nawet jeśli nie jest ona zgodna z zasadami językowymi. Naprawdę powinieneś naprawić podstawowy problem. Opublikuj najmniejszą, możliwą do kompilacji próbkę kodu, która demonstruje problem.

-fpermissive
Obniż część diagnostyki niezgodnego kodu z błędów do ostrzeżeń. W związku z tym użycie -fpermissivepozwoli na kompilację niezgodnego kodu.

David Schwartz
źródło
18

Kiedy napisałeś coś, 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 zdarza się, że mapujesz na jakiś plik wykonywalny, jeśli naiwnie silnik kompilujący -fpermissivezrobi to zamiast zatrzymywać się z tym komunikatem o błędzie. W niektórych przypadkach program będzie zachowywał się dokładnie tak, jak pierwotnie zamierzałeś, ale zdecydowanie nie powinieneś na nim polegać, chyba że masz bardzo szczególny powód, aby nie używać innego rozwiązania.

leftaroundabout
źródło
3
Coś, co nie jest dozwolone w standardzie językowym, można nadal dobrze zdefiniować. W rzeczywistości prawie każdy kompilator ma dobrze zdefiniowane rozszerzenia. Nie mówię, że tak jest w przypadku wszystkich przypadków permisywnych
MikeMB
8

Jeśli potrzebujesz rzeczywistego przypadku użycia do tego, spróbuj skompilować bardzo starą wersję X Windows - powiedzmy, XFree86 lub XOrg z około 2004 roku, tuż obok podziału - używając "nowoczesnej" (kaszlącej) wersji gcc , takie jak 4.9.3.

Zauważysz, że kompilacja CFLAGS zawiera zarówno „-ansi”, jak i „-pedantic”. W teorii oznacza to „wysadzić, jeśli cokolwiek choćby nieznacznie narusza specyfikację języka”. W praktyce seria 3.x gcc nie złapała zbyt wiele tego typu rzeczy, a zbudowanie jej za pomocą 4.9.3 pozostawi dymiącą dziurę w ziemi, chyba że ustawisz CFLAGS i BOOTSTRAPCFLAGS na „-fpermissive”.

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

punkt przerwania
źródło