Prima di tutto, gcc non è un compilatore C conforme per impostazione predefinita. Implementa un dialetto di C89/C90 con estensioni GNU.
È possibile utilizzare -std=cNN -pedantic
(dove NN
può essere 90
, 99
, o 11
) per indurlo a (tentare di) conformarsi a una versione specifica dello standard ISO C. C90 consentito implicito int
; è stato rilasciato nel C99.
Ma i compilatori C non sono in realtà richiesto per generare messaggi di errore irreversibili (ad eccezione di una direttiva #error
). L'esigenza del standard (N1570 5.1.1.3p1) è:
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.
Un avvertimento non fatale si qualifica come un "messaggio di diagnostica". Un compilatore C conforme può stampare un avviso per qualsiasi errore - anche un errore di sintassi - e quindi continuare a compilare correttamente il file sorgente. (Questo è il modo in cui alcune estensioni della lingua specifiche del compilatore possono essere supportate.)
Personalmente, trovo che gcc è eccessivamente lassista su determinati errori; a mio parere, uno mancante deve essere considerato come un errore irreversibile. Ma questa è solo la mia preferenza, non un requisito imposto dallo standard.
La lezione qui è che non si deve presumere che i semplici avvertimenti siano innocui.Idealmente, la compilazione del codice non dovrebbe produrre alcuna diagnostica in tutto. I casi in cui va bene ignorare gli avvertimenti sono rari (ma esistono, dato che i compilatori sono liberi di mettere in guardia sul codice perfettamente valido).
fonte
2014-10-23 19:12:41
Stranamente, '-Werror = implicit-int' funziona per Clang ma non per GCC, mentre' -pedantic-errors' funziona per GCC ma non per Clang. –