Diese Notiz sagt:
-ansi
: Weist den Compiler an, die ANSI-Sprachoption zu implementieren. Dadurch werden bestimmte "Funktionen" von GCC deaktiviert, die nicht mit dem ANSI-Standard kompatibel sind.
-pedantic
: Wird in Verbindung mit verwendet-ansi
, weist dies den Compiler an, sich strikt an den ANSI-Standard zu halten und nicht konformen Code abzulehnen.
Das wichtigste zuerst:
- Was ist der Zweck des
-pedantic
und der-ansi
Optionen des GCC / G ++ - Compilers (ich konnte die obige Beschreibung nicht verstehen)? - Kann mir jemand die richtigen Umstände für die Verwendung dieser beiden Optionen nennen?
- Wann soll ich sie verwenden?
- Sind sie wichtig?
Ich benutze es die ganze Zeit in meiner Codierung.
Die
-ansi
Flagge entspricht-std=c89
. Wie bereits erwähnt, werden einige Erweiterungen von GCC deaktiviert. Durch das Hinzufügen-pedantic
werden mehr Erweiterungen deaktiviert und mehr Warnungen generiert. Wenn Sie beispielsweise ein Zeichenfolgenliteral mit mehr als 509 Zeichen haben,-pedantic
warnt Sie davor, da es die vom C89-Standard geforderte Mindestgrenze überschreitet. Das heißt, jeder C89-Compiler muss Zeichenfolgen der Länge 509 akzeptieren. Sie dürfen länger akzeptieren, aber wenn Sie pedantisch sind, ist es nicht portabel, längere Zeichenfolgen zu verwenden, obwohl ein Compiler längere Zeichenfolgen akzeptieren darf, und ohne die pedantischen Warnungen akzeptiert GCC sie auch.quelle
-std=c89 -pedantic
bedeutet jedoch, dass Sie auf anderen Plattformen einfacher zwischen verschiedenen Compilern wechseln können. Sobald Sie mit der Verwendung beginnen<windows.h>
, wird die Kompatibilität mit anderen Systemen problematisch.-pedantic
, aber die meisten meinen Code kompiliert noch in Ordnung , wenn ich es wieder aktivieren (das Programm , das nicht tat , war explizit mit__int128
Typen, die sind pedantisch falsch). Ich denke, es gab eine Zwischenphase, in der GCC (für meinen Geschmack) zu laut war-pedantic
. Ich habe gerade ungefähr 300 Quelldateien getestet - einige Bibliothekscodes, einige Befehle, einige SO-Testprogramme - und es gab nur das eine zu erwartende Problem. Derzeit wird GCC 4.8.2 unter Mac OS X 10.9.2 verwendet.-ansi
ist ein veralteter Schalter, der den Compiler zu kompilieren , nach dem 30-jährigen fordert veraltete Version von C - Norm , ISO / IEC 9899: 1990 , die im Wesentlichen ein Rebranding der ANSI - Standard „Programmiersprache C C3.159-1989 . Warum veraltet? Denn nachdem C90 von ISO veröffentlicht wurde, war ISO für die C-Normung verantwortlich, und alle technischen Berichtigungen zu C90 wurden von ISO veröffentlicht-std=c90
.Ohne diesen Schalter entsprechen die aktuellen GCC C-Compiler der in ISO / IEC 9899: 2011 standardisierten C-Sprache oder der neuesten Version von 2018.
Leider gibt es einige faule Compiler-Anbieter, die glauben, dass es akzeptabel ist, sich an eine ältere veraltete Standardrevision zu halten, für die das Standardisierungsdokument nicht einmal von Standardgremien erhältlich ist.
Durch die Verwendung des Schalters können Sie sicherstellen, dass der Code in diesen veralteten Compilern kompiliert wird.
Das
-pedantic
ist interessant. In Abwesenheit von-pedantic
selbst , wenn ein bestimmten Standard angefordert wird, wird GCC noch einigen Erweiterungen erlauben , die nicht akzeptabel in der C - Norm. Betrachten Sie zum Beispiel das ProgrammDer C11-Entwurf n1570 Absatz 6.7.6.2p1 lautet :
Der C-Standard verlangt, dass die Array-Länge größer als Null ist. und dieser Absatz ist in den Einschränkungen ; Der Standard besagt Folgendes 5.1.1.3p1 :
Wenn Sie das Programm jedoch mit kompilieren
gcc -c -std=c90 pedantic_test.c
, wird keine Warnung ausgegeben.-pedantic
bewirkt, dass der Compiler tatsächlich dem C-Standard entspricht ; Jetzt wird eine Diagnosemeldung ausgegeben, wie dies vom Standard gefordert wird:Für eine maximale Portabilität reicht es daher nicht aus, die Standardrevision anzugeben. Sie müssen auch
-pedantic
(oder-pedantic-errors
) verwenden, um sicherzustellen, dass GCC tatsächlich dem Buchstaben des Standards entspricht.Der letzte Teil der Frage betraf die Verwendung
-ansi
mit C ++ . ANSI hat die C ++ - Sprache nie standardisiert - nur von ISO übernommen. Dies ist ungefähr so sinnvoll wie die Aussage "Englisch wie von Frankreich standardisiert". GCC scheint es jedoch immer noch für C ++ zu akzeptieren, so dumm es auch klingt.quelle
-std=c11 -Wall -Wextra -Wpedantic -Wconversion
.Grundsätzlich erleichtert dies das Kompilieren Ihres Codes unter anderen Compilern, die ebenfalls den ANSI-Standard implementieren, und, wenn Sie vorsichtig sind, in welchen Bibliotheken / API-Aufrufen Sie verwenden, unter anderen Betriebssystemen / Plattformen.
Die erste Option deaktiviert die SPEZIFISCHEN Funktionen von GCC. (-ansi) Der zweite wird sich über ALLES beschweren, was nicht dem Standard entspricht (nicht nur spezifische Merkmale von GCC, sondern auch Ihre Konstrukte.) (-pedantic).
quelle
Wenn Ihr Code portabel sein muss, können Sie testen, ob er ohne gcc-Erweiterungen oder andere nicht standardmäßige Funktionen kompiliert wird. Wenn Ihr Code mit kompiliert
-pedantic -ansi
wird, sollte er theoretisch mit jedem anderen ANSI-Standard-Compiler in Ordnung kompiliert werden.quelle
-pedantic
schaltet nicht alle Erweiterungen aus, sondern hinterlässt eine Reihe von Dingen mit doppeltem Unterstrich. Es könnte also genauer sein zu sagen, dass wenn Ihr Code mit kompiliert-pedantic -ansi
wird und es auch plausibel aussieht, als würde er auf anderen Implementierungen kompiliert, dann wird er kompiliert.Wenn Sie Code schreiben, von dem Sie sich vorstellen, dass er auf einer Vielzahl von Plattformen mit einer Reihe verschiedener Compiler kompiliert wird, können Sie mithilfe dieser Flags sicherstellen, dass Sie keinen Code erstellen, der nur unter GCC kompiliert wird.
quelle
Andere haben ausreichend geantwortet. Ich möchte nur einige Beispiele für häufige Erweiterungen hinzufügen:
Die
main
Funktion kehrt zurückvoid
. Dies ist nicht durch den Standard definiert, dh es funktioniert nur auf einigen Compilern (einschließlich GCC), nicht jedoch auf anderen. Übrigensint main()
undint main(int, char**)
sind die beiden Signaturen, die der Standard definiert.Eine weitere beliebte Erweiterung ist das Deklarieren und Definieren von Funktionen in anderen Funktionen:
Dies ist nicht Standard. Wenn Sie diese Art von Verhalten wünschen, schauen Sie sich C ++ 11 Lambdas an
quelle
Pedantic macht es so, dass der gcc-Compiler alle GNU C-Erweiterungen ablehnt, nicht nur diejenigen, die ihn ANSI-kompatibel machen.
quelle