Zunächst ist gcc standardmäßig kein konformer C-Compiler. Es implementiert einen Dialekt von C89/C90 mit GNU-Erweiterungen.
können Sie verwenden -std=cNN -pedantic
(wo NN
kann 90
, 99
oder 11
sein), um es dazu führen, (Versuch) auf eine bestimmte Version des ISO-C-Standard entsprechen. C90 erlaubt implizit int
; es wurde in C99 fallen gelassen.
Aber C-Compiler sind nicht wirklich erforderlich, um fatale Fehlermeldungen zu generieren (außer für eine #error
Richtlinie). Die Standard-Anforderung (N1570 5.1.1.3p1) ist:
A conforming implementation shall produce at least one diagnostic message (identified in an implementation-defined manner) if a preprocessing translation unit or translation unit contains a violation of any syntax rule or constraint, even if the behavior is also explicitly specified as undefined or implementation-defined. Diagnostic messages need not be produced in other circumstances.
Eine nicht-fatale Warnung gilt als "Diagnose". Ein konformer C-Compiler kann eine Warnung für jeden Fehler ausgeben - sogar einen Syntaxfehler - und anschließend die Quelldatei erfolgreich kompilieren. (So können einige Compiler-spezifische Spracherweiterungen unterstützt werden.)
Persönlich finde ich, dass gcc über bestimmte Fehler übermäßig lax ist; Meiner Meinung nach sollte ein int
als ein fataler Fehler behandelt werden. Aber das ist nur meine Vorliebe, keine Anforderung des Standards.
Die Lektion hier ist, dass Sie nicht davon ausgehen sollten, dass nur Warnungen harmlos sind.Idealerweise sollte das Kompilieren Ihres Codes keine Diagnose überhaupt erzeugen. Fälle, in denen es in Ordnung ist, Warnungen zu ignorieren, sind selten (aber sie existieren, da Compiler frei sind, vor vollkommen gültigem Code zu warnen).
Seltsamerweise funktioniert '-Werror = implicit-int' für Clang, aber nicht GCC, während' -pedantic-errors' für GCC, aber nicht Clang funktioniert. –