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?
risposta
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
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. –
@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. –
Ho scritto un post su questo: http://shitalshah.com/p/how-to-enable-and-use-gcc-strict-mode-compilation/ – ShitalShah
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.
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" –
- 1. gcc -Wshadow è troppo rigido?
- 2. Opzioni GCC per far rispettare il controllo standard Ansi C?
- 3. Disabilita avviso gcc per opzioni incompatibili
- 4. GCC è pronto per il codice di produzione C++ 14?
- 5. Grammatica C nel codice sorgente GCC
- 6. Aggiungere opzioni GCC alla cima del file sorgente C
- 7. GCC C++ e codice assembly inline?
- 8. gcc non avvisa il codice irraggiungibile
- 9. Parser di opzioni per C/C++?
- 10. Javascript per selezionare più opzioni
- 11. Calcolo dell'inerzia per un corpo rigido a più forme
- 12. Qual è il modo più semplice in C# per verificare se il disco rigido è SSD senza scrivere alcun file sul disco rigido?
- 13. Come allineare il corpo per il ciclo C con GCC?
- 14. Opzioni gcc per un processore ARM iMX6q freescale
- 15. Leggere i settori del disco rigido in C++ su Linux
- 16. qmake: opzioni di gestione per gcc e msvc
- 17. Buono profiler C++ per GCC
- 18. Come posso definire più opzioni per UIViewAnimation?
- 19. Opzioni per lo sfilacciamento del codice Cython
- 20. Il codice C# è più veloce del codice Visual Basic.NET?
- 21. un puntatore per capire il codice sorgente GCC
- 22. Cross compilazione GCC con newlib per ARM: come specificare le opzioni GCC come -march?
- 23. Come compilare a livello di codice un codice c da un codice C# usando il compilatore mingw32-gcc
- 24. Differenza tra le opzioni di compilazione gcc std = C++ 1y e std = C++ 14
- 25. Boost socket asio: il modo più veloce per leggere il file dal disco rigido?
- 26. Riutilizzo del menu Opzioni codice
- 27. flag di ottimizzazione gcc -O3 rende il codice più lento quindi -O2
- 28. Come compilare un codice C++ in gcc (g ++) per vedere il nome mangling su funzioni sovraccariche?
- 29. Collegamento di codice C++ con 'gcc' (senza g ++)
- 30. Opzioni per il clustering Lucene.NET?
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
@mctylr: "Sto scrivendo in C89" sembra perfettamente chiaro. –
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. –