Ich frage mich nur, was das -fpermissive
Flag im g ++ - Compiler macht. Ich bekomme:
Fehler: Adresse von temporär nehmen [-fpermissive]
was ich lösen kann, indem ich -fpermissive
dem Compiler das Flag gebe .
EDIT : Ich habe gerade herausgefunden, was den temporären Adressfehler verursacht hat! Ich werde diesen Teil jetzt reparieren.
c++
gcc
compiler-options
mmirzadeh
quelle
quelle
Das
-fpermissive
Flag 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.quelle
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
-fpermissive
genau 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.quelle
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. =]
quelle