2014-10-23 3 views

Antwort

7

Dies liegt daran, obwohl implicit int is no longer part of the C standard since C99 einig Compiler unterstützen es immer noch, hauptsächlich um zu verhindern, dass viel alter Code kaputt geht. Also diese Zeile:

dfljshfksdhfl; 

endet als äquivalent zu:

int dfljshfksdhfl; 

clang gibt uns eine viel informativer Warnung von Standard:

warning: type specifier missing, defaults to 'int' [-Wimplicit-int] 
dfljshfksdhfl; 
^~~~~~~~~~~~~ 

Wir die -pedantic-errors Flag verwenden können, um drehen dies in einen Fehler, obwohl seltsam genug funktioniert dies nicht für clang und so müssen wir auf -Werror zurückgreifen und alle Warnungen in auf Fehler, was eigentlich eine gute Gewohnheit ist, in die man hineinkommt. Wie remyabel auf clang hinweist, können wir auch -Werror=implicit-int verwenden.

+0

Seltsamerweise funktioniert '-Werror = implicit-int' für Clang, aber nicht GCC, während' -pedantic-errors' für GCC, aber nicht Clang funktioniert. –

1

Ich habe bereits eine similar question beantwortet (eigentlich bin ich mir ziemlich sicher, es ist ein Duplikat, aber was auch immer) und die Antwort ist in der C99 Begründung gefunden.

A new feature of C99:

In C89, all type specifiers could be omitted from the declaration specifiers in a declaration. In such a case int was implied. The Committee decided that the inherent danger of this feature outweighed its convenience, and so it was removed. The effect is to guarantee the production of a diagnostic that will catch an additional category of programming errors. After issuing the diagnostic, an implementation may choose to assume an implicit int and continue to translate the program in order to support existing source code that exploits this feature.

@ Shafik die Antworten sagt Ihnen eine Möglichkeit, die Warnung in einen Fehler zu machen (für Clang). Wenn Sie davon ausgehen, dass -Werror zu streng ist, können Sie diese eine Warnung in einen Fehler mit -Werror=implicit-int umwandeln. In GCC scheint es, dass -pedantic-errors notwendig ist.

0

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).

Verwandte Themen