Was macht die zulässige Flagge?

121

Ich frage mich nur, was das -fpermissiveFlag im g ++ - Compiler macht. Ich bekomme:

Fehler: Adresse von temporär nehmen [-fpermissive]

was ich lösen kann, indem ich -fpermissivedem Compiler das Flag gebe .

EDIT : Ich habe gerade herausgefunden, was den temporären Adressfehler verursacht hat! Ich werde diesen Teil jetzt reparieren.

mmirzadeh
quelle

Antworten:

146

Direkt aus den Dokumenten :

-fpermissive
Führen Sie ein Downgrade einiger Diagnosen zu nicht konformem Code von Fehlern auf Warnungen durch. Wenn Sie also verwenden, -fpermissivekann ein fehlerhafter Code kompiliert werden.

Fazit: Verwenden Sie es nur, wenn Sie wissen, was Sie tun!

cli_hlt
quelle
4
Ich erwarte mehr Informationen als das Zitathandbuch + "Verwenden Sie es erst, wenn Sie wissen, was Sie tun" aus der Antwort mit der höchsten Bewertung. Ich muss dafür nicht googeln. Welche Fälle von fehlerhaftem Code werden genau herabgestuft?
johannes_lalala
Nicht fehlerhafter Code wird herabgestuft, aber die Diagnose reicht von Fehlern bis zu Warnungen. Ein Beispiel ist der Fragenöffner. Wenn Sie nicht wissen, was die Randfälle sein könnten, sollten Sie nicht in Betracht ziehen, sie zu verwenden.
Cli_hlt
2
Sorry Mann, nichts für ungut, aber Ratschläge wie "Tu nichts, wenn du die Auswirkungen nicht kennst" sind trivial und passen zu jeder Frage und beantworten keine.
johannes_lalala
3
.. und sorry, aber nur das Handbuch zu zitieren, ohne es näher zu erläutern, ist nicht hilfreich. Besonders in einem Fall, in dem das Handbuch sehr spärlich ist.
johannes_lalala
50

Das -fpermissiveFlag veranlasst den Compiler, einige Dinge, die tatsächlich Fehler sind (von einigen Compilern jedoch zugelassen werden), als Warnungen zu melden, damit der Code kompiliert werden kann, auch wenn er nicht den Sprachregeln entspricht. Sie sollten das zugrunde liegende Problem wirklich beheben. Veröffentlichen Sie das kleinste kompilierbare Codebeispiel, das das Problem demonstriert.

-fpermissive
Führen Sie ein Downgrade einiger Diagnosen zu nicht konformem Code von Fehlern auf Warnungen durch. Wenn Sie also verwenden, -fpermissivekann ein fehlerhafter Code kompiliert werden.

David Schwartz
quelle
18

Wenn Sie haben etwas geschrieben , das nicht von dem Sprachstandard erlaubt ist (und daher nicht wirklich gut definierte Verhalten werden kann, der Grund genug ist , es nicht zu tun) , aber passieren mit abzubilden gewissen Art von ausführbaren wenn naiv zugeführt Die Kompilierungs-Engine wird dann -fpermissivegenau das tun, anstatt mit dieser Fehlermeldung anzuhalten. In einigen Fällen verhält sich das Programm dann genau so, wie Sie es ursprünglich beabsichtigt hatten, aber Sie sollten sich definitiv nicht darauf verlassen, es sei denn, Sie haben einen ganz besonderen Grund, keine andere Lösung zu verwenden.

links herum
quelle
3
Etwas, das vom Sprachstandard nicht erlaubt ist, kann immer noch gut definiert werden. Tatsächlich hat fast jeder Compiler gut definierte Erweiterungen. Nicht zu sagen, dass dies bei allen Fällen von Erlaubnis der Fall ist
MikeMB
8

Wenn Sie hierfür einen realen Anwendungsfall wünschen, versuchen Sie, eine sehr alte Version von X Windows zu kompilieren - beispielsweise XFree86 oder XOrg aus dem Jahr 2004, direkt um den Split herum - und verwenden Sie dabei eine "moderne" (Husten-) Version von gcc , wie 4.9.3.

Sie werden feststellen, dass die Build-CFLAGS sowohl "-ansi" als auch "-pedantic" angeben. Theoretisch bedeutet dies "in die Luft jagen, wenn etwas die Sprachspezifikation auch nur geringfügig verletzt". In der Praxis hat die 3.x-Serie von gcc nicht viel von solchen Dingen gefangen, und wenn Sie sie mit 4.9.3 erstellen, bleibt ein Rauchloch im Boden, es sei denn, Sie setzen CFLAGS und BOOTSTRAPCFLAGS auf "-fpermissive".

Mit diesem Flag werden die meisten dieser C-Dateien tatsächlich erstellt, sodass Sie zu dem vom Lexer generierten versionierungsabhängigen Wrack wechseln können. =]

Haltepunkt
quelle