2009-11-30 9 views
9

Welche GCC-Optionen soll ich verwenden, um ANSI C (C99) Warnungen/Fehler zu erzwingen? gcc (GCC) 3.4.2 (mingw-special)GCC-Optionen zum Erzwingen der Ansi C-Standardprüfung?

Ich verwende: gcc -pedantic -ansi -std = c99 ist das richtig?

+0

ANSI veröffentlichte den ursprünglichen C-Standard im Jahr 1989. ISO veröffentlichte seine Version des gleichen Standards im Jahr 1990, und ANSI nahm diese Version offiziell an. ISO veröffentlichte 1999 und 2011 neue Editionen des Standards, und ANSI hat jeden von ihnen übernommen, wodurch die früheren Ausgaben offiziell veraltet sind. Verwirrenderweise wird der Begriff "ANSI C" immer noch häufig (und fälschlicherweise) verwendet, um auf die in den Ausgaben von 1989/1990 definierte Sprache zu verweisen, und "gcc -ansi" bezieht sich immer noch auf diese Version. Ich schlage vor, dass der Begriff "ANSI C" mehrdeutig ist und vermieden werden sollte. Siehe stattdessen C89/C90, C99 oder C11. –

Antwort

3
-ansi 
    In C mode, this is equivalent to -std=c89. In C++ mode, it is equivalent to -std=c++98. 

ANSI C ist nicht dasselbe wie C99 (noch). Auch könnte -Wall von Interesse sein, aber nur -pedantic sollte tun, was Sie wollen.

+5

"ANSI C ist nicht dasselbe wie C99". ANSI hat C99 als Standard übernommen. Aus welchem ​​Grund auch immer, C89 wurde "ANSI C" genannt, um es von dem Standard-C zu unterscheiden, und der Name ist geblieben. –

7

Dies ist eine alte Frage, aber ich wollte nur ein paar zusätzliche Punkte hinzufügen.

Erstens, unabhängig von den generischen Befehlszeilenoptionen, die Sie an GCC liefern, scheint es derzeit nicht möglich zu sein, GCC alle Constraint-Verletzungen als "Fehler" und alles andere als "Warnungen ". Einige der Diagnosemeldungen, die GCC als "Warnungen" meldet, sind tatsächlich Constraint-Verletzungen (dh "Fehler") vom Standpunkt der C-Sprache, aber es gibt keine Möglichkeit, GCC zu zwingen, diese Tatsache zu erkennen und einen "Fehler" zu erzeugen. Diagnose. Möglicherweise kann eine genauere Trennung durch Feinabstimmung einzelner Warntypen erreicht werden, aber ich bin nicht sicher, ob die GCC-Einstellungen eine ausreichende Granularität bieten, um eine gute Übereinstimmung zu erzielen.

Zweitens bietet GCC -pedantic-errors Option, die anstelle von Plain -pedantic verwendet werden kann, die eine genauere (wie oben beschrieben) Klassifizierung von Diagnosemeldungen in "Fehler" und "Warnungen" ermöglichen soll. Es ist immer noch nicht perfekt.

P.S. Die Sprachspezifikation erfordert/definiert nicht die Trennung von Diagnosemeldungen in "Fehler" und "Warnungen", aber in der Praxis erwarten viele Programmierer, dass Einschränkungsverletzungen als "Fehler" gemeldet werden. Ich dachte, Sie hätten vielleicht so etwas gemeint, als Sie in Ihrer Frage "Warnungen/Fehler erzwingen" erwähnt haben.

+0

Gute Beobachtungen. Auf jeden Fall glaube ich, da C so viele gefährliche Dinge zulässt, ist die einzig vernünftige Art zu arbeiten, die * any * Warnung als Fehler zu behandeln (d. H. Du bist nicht fertig, bis es mit "-Werror" erstellt wurde). Dann ist es egal, ob einige Fehler fälschlicherweise als Warnungen gemeldet werden. – sleske

Verwandte Themen