2012-01-20 9 views
20

Quali opzioni GCC dovrebbero essere impostate per avere GCC il più rigoroso possibile? (e intendo il più rigoroso possibile) Scrivo in C89 e voglio che il mio codice sia conforme a ANSI/ISO.Opzioni GCC per il codice C più rigido?

+0

Per più stretto si dovrebbe essere chiaro lo standard che si prendono di mira. ANSI X3.159-1989 e/o ISO/IEC 9899: 1990, ISO/IEC 9899: 1999 o "C1X" dal gruppo di lavoro ISO/IEC (http://www.open-std.org/JTC1/SC22/ WG14) (JTC1/SC22/WG14). ANSI C e ISO C90 differiscono solo nella numerazione delle sezioni dello standard stesso AFAIK – mctylr

+0

@mctylr: "Sto scrivendo in C89" sembra perfettamente chiaro. –

+2

In senso stretto, C89 non è conforme a ANSI/ISO. L'attuale standard ISO C è quello pubblicato nel 2011; questo è anche l'attuale standard ANSI C; gli standard del 1989, 1990 e 1999 sono ufficialmente obsoleti. Ma questo è solo un cavillo sulla formulazione; c'è ancora un supporto diffuso per C89/C90 (più che per C99), e si può ancora conformarsi ad esso anche se non è più uno standard ufficiale. –

risposta

18

Mi consiglia di utilizzare:

-Wall -Wextra -std=c89 -pedantic -Wmissing-prototypes -Wstrict-prototypes \ 
    -Wold-style-definition 

dovrai compilare con -O così come -g come alcuni avvisi sono disponibili solo quando si utilizza l'ottimizzatore (in realtà, io di solito uso -O3 per individuare i problemi). Potresti preferire -std=gnu89 in quanto disabilita un numero inferiore di estensioni nelle librerie. OTOH, se stai codificando su rigoroso ANSI C89, forse li vuoi disabilitati. L'opzione -ansi è equivalente a -std=c89 ma non del tutto esplicita o flessibile.

I prototipi mancanti avvisano l'utente delle funzioni utilizzate (o delle funzioni esterne definite) senza un prototipo in ambito. I prototipi rigidi indicano che non è possibile utilizzare "parentesi vuote" per dichiarazioni di funzioni o definizioni (o puntatori di funzioni); o hai bisogno di (void) o dell'elenco degli argomenti corretto. La definizione vecchio stile ha visto K & definizioni di funzioni in stile R, come ad esempio:

int old_style(a, b) int a; double b; { ... } 

Se siete fortunati, non sarà necessario preoccuparsi di questo. Non sono così fortunato al lavoro, e non posso usare prototipi rigidi, con mio grande dispiacere, perché ci sono troppi puntatori di funzioni approssimative in giro.

Consulta anche: What is the best command-line tool to clean up code

+1

Le opzioni '-Wmissing-prototypes -Wintict-prototypes -Wold-style-definition' sono una buona idea, ma non si rivolgono alla conformità standard. Le dichiarazioni e le definizioni delle funzioni vecchio stile sono obsolete dal 1989, ma fanno ancora parte del linguaggio; anche i compilatori conformi a C2011 sono tenuti a supportarli. –

+1

@Keith: hai attivato il flag '-pedantic' nella tua lettura: D Sì, ma consiglio comunque di utilizzare le opzioni in modo che il codice possa essere inoltrato al massimo alle versioni successive dello standard. Non mi sorprenderebbe scoprire che C2021 alla fine perde il supporto standard per le funzioni non prototipali, sebbene le implementazioni continueranno probabilmente a supportare le vecchie notazioni per altri 10-20 anni dopo. C11 elimina anche 'gets()'; Nemmeno mi aspetto che sparisca dalle biblioteche per molto tempo. Dovrebbe essere evitato, anche se è completamente compatibile con C89. –

+0

Ho scritto un post su questo: http://shitalshah.com/p/how-to-enable-and-use-gcc-strict-mode-compilation/ – ShitalShah

6

Questo set di opzioni è abbastanza buono:

-Wall -Wextra -ansi -pedantic 

Dovrete leggere la documentazione per vedere se ci sono eventuali avvisi aggiuntivi sempre lasciato fuori da tale combinazione.

Si dovrebbe essere avvisati che il C89 rigido non include il supporto per i commenti di stile // e ci sono alcune restrizioni piuttosto serie sul numero di caratteri significativi nei nomi di oggetti con collegamento esterno.

+0

La documentazione dice che "-ansi -pedantic" dovrebbe ottenere la rigorosa ISO C90 e avviserà su QUALSIASI estensione GNU C (non solo quelli che sono incompatibili). Puoi usare "-pedantic-errors" se vuoi errori. Sebbene non sia davvero un problema di rigore, puoi considerare "-Werror" che trasformerà gli avvisi in errori. Sebbene filosoficamente "gli avvertimenti non siano errori" –

Problemi correlati