2011-01-11 13 views
5

Eventuali duplicati:
Best compiler warning level for C/C++ compilers?C++: quali parametri GNU G ++?

GCC ha migliaia di opzioni per aggiungere più avvisi; Speravo che -Wall-Wextra-pedantic includesse tutti quelli utili, ma proprio ora ho incontrato -Woverloaded-virtual che mi sembra davvero carino.

Quali altri parametri G ++ usi o consiglieresti?

+0

Forse controllare la documentazione? – asveikau

+2

Duplicato di http://stackoverflow.com/questions/399850/best-compiler-warning-level-for-c-c-compilers. – EmeryBerger

+0

Mi è mancato, mi dispiace. – peoro

risposta

2

Non proprio la stessa categoria, ma compilo sempre con -Werror per contrassegnare gli avvisi come errori. Molto utile.

per fare questo lavoro con 3 ° intestazioni di partito, includo queste intestazioni via -isystem invece di -I ... altrimenti le avvertenze in queste intestazioni rompere la build.

C'è anche -Weffc++ che avverte per problemi specifici delineati in di Meyers Efficace C++. Tuttavia, ho trovato questo troppo duro. Ad esempio, avvisa per le classi base che non dichiarano i distruttori virtuali. In teoria, questo è molto bello, ma sto lavorando su una libreria di template che usa l'ereditarietà per il riutilizzo del codice (e le classi di policy) e ovviamente non hanno (né hanno bisogno) di distruttori virtuali.

+0

Sono d'accordo che '-WeffC++' è troppo duro. Di tanto in tanto, però, lo compilo per controllare il mio codice. – maxelost

+1

Ironia della sorte, '-WeffC++' avverte di derivare dalla classe della politica 'boost :: noncopyable', ma l'iheriting da una classe di questo tipo è raccomandato da Effective C++. Allo stesso modo, avverte sull'eredità di 'std :: unary_function' e amici. GCC dovrebbe essere un po 'più intelligente qui: una classe senza membri di dati e senza funzioni di membro pubblico è improbabile che possa essere utilizzata polimorficamente. – Philipp

+1

@Philipp: I problemi sono noti e ci sono diversi bug archiviati e discussioni sulla mailing list GCC a riguardo ... Non vedo che questo verrà risolto presto, però. –

1

Alcuni che ho visto che vengono utilizzati;

-Wcast-qual: Avvisami quando un puntatore viene colata in modo da rimuovere qualificazioni tipo dal tipo di destinazione. Ad esempio, avvisare se un const char * viene lanciato su un numero ordinario char *.

-Wpointer-arith: Avvisare qualsiasi cosa che dipende dalla dimensione di un tipo di funzione o di void. GNU C assegna questi tipi una dimensione di 1, per comodità nei calcoli con i puntatori void * e i puntatori alle funzioni.

-Wwrite-strings: Durante la compilazione C, dare stringa costanti del tipo const char[length] in modo che la copia l'indirizzo di uno in un non-constchar * puntatore otterrà un avvertimento; durante la compilazione di C++, avvisare sulla conversione obsoleta da stringhe letterali a char *. Questo avviso, per impostazione predefinita, è abilitato per i programmi C++. Questi avvertimenti ti aiuteranno a trovare a tempo di compilazione codice che può provare a scrivere in una costante di stringa, ma solo se sei stato molto attento sull'utilizzo di const in dichiarazioni e prototipi. Altrimenti, sarà solo una seccatura; questo è il motivo per cui non abbiamo fatto -Wall richiedere questi avvertimenti.

-Wdisabled-optimization: Avvisa se un passaggio di ottimizzazione richiesto è disabilitato. Questo avviso generalmente non indica che c'è qualcosa di sbagliato nel tuo codice; indica semplicemente che gli ottimizzatori di GCC non erano in grado di gestire il codice in modo efficace. Spesso, il problema è che il tuo codice è troppo grande o troppo complesso; GCC rifiuterà di ottimizzare i programmi quando è probabile che l'ottimizzazione stessa richieda tempi eccessivi.

2

Vedere Best compiler warning level for C/C++ compilers?. Un post contiene la seguente lista esauriente (ed esauriente).

-g -O -Wall -Weffc++ -pedantic \ 
    -pedantic-errors -Wextra -Wall -Waggregate-return -Wcast-align \ 
    -Wcast-qual -Wchar-subscripts -Wcomment -Wconversion \ 
    -Wdisabled-optimization \ 
    -Werror -Wfloat-equal -Wformat -Wformat=2 \ 
    -Wformat-nonliteral -Wformat-security \ 
    -Wformat-y2k \ 
    -Wimplicit -Wimport -Winit-self -Winline \ 
    -Winvalid-pch \ 
    -Wunsafe-loop-optimizations -Wlong-long -Wmissing-braces \ 
    -Wmissing-field-initializers -Wmissing-format-attribute \ 
    -Wmissing-include-dirs -Wmissing-noreturn \ 
    -Wpacked -Wpadded -Wparentheses -Wpointer-arith \ 
    -Wredundant-decls -Wreturn-type \ 
    -Wsequence-point -Wshadow -Wsign-compare -Wstack-protector \ 
    -Wstrict-aliasing -Wstrict-aliasing=2 -Wswitch -Wswitch-default \ 
    -Wswitch-enum -Wtrigraphs -Wuninitialized \ 
    -Wunknown-pragmas -Wunreachable-code -Wunused \ 
    -Wunused-function -Wunused-label -Wunused-parameter \ 
    -Wunused-value -Wunused-variable -Wvariadic-macros \ 
    -Wvolatile-register-var -Wwrite-strings 
+0

Alcuni di questi sono ridondanti. Ad esempio, il secondo '-Wall' e' -Wcomment' sono entrambi impliciti dal primo '-Wall'. '-Werror' +' -pedantic' implica '-pedantic-errors'. –

+1

Infatti. In ogni caso, è eccessivo. Ma è un buon punto di partenza. – EmeryBerger

1

In generale, abilito tutti gli avvisi e quindi rimuovo questi flag in modo selettivo che forniscono uscite inutili. In uno dei miei progetti, io uso il seguente C e C++ avvertimenti:

-pedantic 
-Wall 
-Wextra 
-Wformat=2 
-Wmissing-include-dirs 
-Wswitch-default 
-Wswitch-enum 
-Wunused 
-Wstrict-aliasing=1 
-Wfloat-equal 
-Wundef 
-Wunsafe-loop-optimizations 
-Wpointer-arith 
-Wcast-qual 
-Wcast-align 
-Wwrite-strings 
-Wconversion 
-Wmissing-format-attribute 
-Wpacked 
-Wredundant-decls 
-Winvalid-pch 
-Wvolatile-register-var 
-Wsync-nand 
-Wsign-conversion 
-Wlogical-op 
-Wmissing-declarations 
-Wmissing-noreturn 
-Wstrict-overflow=5 
-Wstack-protector 

Inoltre, io uso i seguenti C bandiere ++:

-std=c++98 
-Wnon-virtual-dtor 
-Wctor-dtor-privacy 
-Wstrict-null-sentinel 
-Woverloaded-virtual 
-Wsign-promo 

Inoltre, per il build di rilascio è possibile attivare le seguenti avvertenze:

-pedantic-errors 
-Werror 
-Wuninitialized 
-Winit-self 
-Wdisabled-optimization 

trovo fastidioso che -Wall consente solo il minimo assoluto di avvertimenti al posto di "tutti", come dice il nome.

+0

Avrei pensato che '-Wdisabled-optimization -Werror' è un po 'coraggioso in modalità di rilascio. Rifiuta qualsiasi codice che non è adatto per * tutte * le ottimizzazioni. O è un trucco per imporre piccole funzioni? ;-) –

+0

@Steve Jessop: per quel progetto (che è molto piccolo) funziona, ma per altri progetti disabiliterei quella bandiera se causasse avvertimenti. Inoltre, '-Wswitch-enum' può diventare piuttosto fastidioso per grandi enumerazioni. – Philipp

1

Oltre a quelli già citati:

-pedantic     Issue warnings needed for strict compliance to the standard 
-Wall 
-Wextra      Print extra (possibly unwanted) warnings 
-Werror      Treat all warnings as errors 
-std=c++0x     Conform to the ISO 1998 C++ standard, with extensions that are likely to be in C++0x 
-std=c++98     Conform to the ISO 1998 C++ standard 
Problemi correlati