2014-10-23 14 views

risposta

7

Questo perché, anche se implicit int is no longer part of the C standard since C99 alcuni i compilatori lo supportano ancora, principalmente per evitare di rompere un sacco di vecchio codice. Così questa linea:

dfljshfksdhfl; 

finisce per essere equivalente a:

int dfljshfksdhfl; 

clang ci dà un avvertimento molto più informativo per impostazione predefinita:

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

possiamo usare il flag -pedantic-errors a girare questo in un errore, anche se stranamente questo non funziona per clang e quindi dobbiamo ricorrere a -Werror e attivare tutti gli avvisi in agli errori, che è in realtà una buona abitudine per entrare. Come remyabel indica per clang, possiamo anche usare -Werror=implicit-int.

+0

Stranamente, '-Werror = implicit-int' funziona per Clang ma non per GCC, mentre' -pedantic-errors' funziona per GCC ma non per Clang. –

1

Ho già risposto a uno similar question (in realtà sono abbastanza sicuro che sia un duplicato, ma qualunque sia) e la risposta si trova nella logica C99.

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.

@ risposte di Shafik si dice un modo per trasformare l'avvertimento in un errore (per Clang). Se consideri -Werror troppo rigido, puoi trasformare quell'unico avviso in un errore con -Werror=implicit-int. In GCC, sembra che sia necessario -pedantic-errors.

0

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

Problemi correlati