Cosa fa "-Wall" in "g ++ -Wall test.cpp -o test"?


92

-o cambia il nome del file di output (l'ho scoperto usando --help)

Ma non riesco a scoprire cosa -Wallfa?


7
"man gcc" sulla tua console ti dice tutto su questo flag e una semplice ricerca su Google con "gcc -Wall" pure ...
David Sauter

Come suggerimento generale, prova a leggere le manvoci per i programmi se vuoi sapere cosa fa un interruttore o quali interruttori sono disponibili. La manpagina di gccpuò essere letta su linux.die.net/man/1/gcc - puoi fare una rapida ricerca lì per il testo "-Wall"
gnud

6
@David Sauter, Google non troverà nulla con "-wall". Escluderà tutti i "wall" dalla ricerca.
Kirill V. Lyadvinsky

@ Kirill No se usi le virgolette, come immagino che David intenda
gnud

1
//, ho sempre pensato che fosse un omaggio a Larry Wall.
Nathan Basanese

Risposte:


110

È l'abbreviazione di "warn all" - attiva (quasi) tutti gli avvisi di cui g ++ può dirti. In genere una buona idea, soprattutto se sei un principiante, perché comprendere e correggere questi avvisi può aiutarti a risolvere molti tipi diversi di problemi nel tuo codice.


24
Altri avvisi (alcuni dei quali sono piuttosto utili) possono essere attivati ​​con -Wextrae -pedantic.
gnud

7
Non è (quasi) tutto. In realtà è solo una piccolissima parte degli avvisi disponibili. Sono quelli su cui "tutti" sono d'accordo. L' davvero buona idea è quella di fare -Wall -Wextra, e poi esplorare il manuale per trovare il maggior numero di altri avvertimenti si potrebbe attivare il più possibile, perché anche -Wextraè solo un piccolo sottoinsieme ...
DevSolar

@DevSolar ottimo punto. Sai se c'è una bandiera che significa "letteralmente tutti gli avvertimenti"?
MatrixFrog

1
@ MatrixFrog: Sfortunatamente, non esiste tale opzione, almeno non per i compilatori che conosco. E l'elenco degli avvisi disponibili cambia nel tempo ... se il team di GCC non avesse disabilitato -Wunreachable-codequalche tempo fa, Apple sarebbe molto più felice in questi giorni. ;-)
DevSolar

36

Vedi man gcc.

-Wall attiva questi avvisi:

-Waddress -Warray-bounds (only with -O2) -Wc++0x-compat -Wchar-subscripts
-Wenum-compare (in C/Objc; this is on by default in C++) -Wimplicit-int (C and
 Objective-C only) -Wimplicit-function-declaration (C and Objective-C only) 
-Wcomment -Wformat -Wmain (only for C/ObjC and unless -ffreestanding) 
-Wmissing-braces -Wnonnull -Wparentheses -Wpointer-sign -Wreorder -Wreturn-type 
-Wsequence-point -Wsign-compare (only in C++) -Wstrict-aliasing 
-Wstrict-overflow=1 -Wswitch -Wtrigraphs -Wuninitialized -Wunknown-pragmas 
-Wunused-function -Wunused-label -Wunused-value -Wunused-variable 
-Wvolatile-register-var

-Wextra contiene:

-Wclobbered -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers
-Wmissing-parameter-type (C only) -Wold-style-declaration (C only) -Woverride-init
-Wsign-compare -Wtype-limits -Wuninitialized -Wunused-parameter (only with -Wunused
 or -Wall) -Wunused-but-set-parameter (only with -Wunused or -Wall)

Ci sono molti altri avvisi che devi attivare esplicitamente.

Ad esempio per il nostro codice C usiamo:

-Wall -Wextra -Waggregate-return -Wcast-align -Wcast-qual -Wdisabled-optimization -Wdiv-by-zero -Wendif-labels -Wformat-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wimplicit -Wimport -Winit-self -Winline -Winvalid-pch -Wjump-misses-init -Wlogical-op -Werror = missing-braces -Wmissing-dichiarations -Wno-missing-format-attribute -Wmissing-include-dirs -Wmultichar -Wpacked -Wpointer-arith -Wreturn-type -Wsequence-point -Wsign-compare -Wstrict-aliasing -Wstrict-aliasing = 2 -Wswitch -Wswitch-default -Werror = undef -Wno-unused -Wvariadic-macro -Wwrite-strings -Wc ++ -compat -Werror = dichiarazione-dopo-istruzione -Werror = dichiarazione-funzione-implicita -Wmissing-prototypes -Werror = nested-externs -Werror = definizione vecchio stile -Werror = strict-prototypes

o solo il set di avvisi con https://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html


19

Purtroppo, nessuna delle risposte sta citando la parte effettivamente rilevante del manuale, il che lo porta davvero a un punto:

Ciò abilita tutti gli avvisi sulle costruzioni che alcuni utenti considerano discutibili e che sono facili da evitare (o modificare per impedire l'avviso), anche in combinazione con le macro.

[...]

Notare che alcuni flag di avviso non sono impliciti da -Wall. Alcuni di loro mettono in guardia contro costruzioni che gli utenti generalmente non considerano discutibili, ma che occasionalmente potresti voler verificare; altri segnalano costruzioni che in alcuni casi sono necessarie o difficili da evitare e non esiste un modo semplice per modificare il codice per sopprimere l'avviso. Alcuni di essi sono abilitati da, -Wextra ma molti di essi devono essere abilitati individualmente.

Quindi:

  • -Wallnon non significa "tutte le avvertenze".
  • Inoltre, non significa "(quasi) tutti", neanche lontanamente.
  • Essa non significa un insieme di singole opzioni che è destinata a cambiare .

In conclusione, si tratta del minimo assoluto di avvisi da impostare. Anche se -Wall -Wextraè meglio, non sta ancora facendo uso di tutti gli errori che il tuo compilatore può fare per te.


Personalmente non andrei per meno di -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual. Tutti i miei progetti attuali utilizzano effettivamente un elenco di avvisi più lungo di quello (senza attivarne nessuno). E controllo il manuale su ogni versione principale per nuove opzioni. Il compilatore è tuo amico. Usa qualsiasi diagnostica che può offrirti.


Ho iniziato a imparare a programmare usando C ++. Sto usando i principi di programmazione e faccio pratica usando cpp . Il mio sistema è ubuntu 16.04, uso vscode come editor. Mi consigli di usare il tuo -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtualmentre compilo g++ -std=c++11mentre imparo il c ++ e la programmazione? O dovrei saltare questa parte e iniziare a utilizzare i flag dei messaggi di errore in seguito? In tal caso, quando devo iniziare con i messaggi di errore?
scientific_explorer

2
@vkv: credo che il compilatore sia davvero tuo amico e dovresti approfittare di ogni piccolo consiglio che può darti.
DevSolar


2

It enables most warning messages.

Puoi saperne di più se usi g++ --help=warnings.


0

Abilita tutti gli avvisi. (si legge come "Avviso tutto")


In realtà ci sono molti avvisi che non abilita (come dtor non virtuale in una classe con metodi virtuali).
Mark B

vedi la risposta di Yuval: -Wallsignifica solo "la maggior parte degli avvisi" invece di "tutti gli avvisi".
HaxtraZ

-1

Mostra tutti gli avvisi. Consiglierei anche di usarlo -pedanticper mettere in guardia su alcune parti di codice non conformi.


Per gcc doc: "Alcuni utenti provano a usare -pedantic per controllare la stretta conformità ISO C dei programmi. Presto scoprono che non fa proprio quello che vogliono: trova alcune pratiche non ISO, ma non tutte, solo quelle per le quali ISO C richiede una diagnostica e alcune altre per le quali è stata aggiunta la diagnostica. "
AProgrammer

Non offre una garanzia al 100%, ma aiuta.
Kirill V. Lyadvinsky

1
Se non avessi scritto alcune invece di tutte in "per avvertire di tutte le parti non conformi", non avrei commentato. Ma la tua attuale formulazione diffonde semplicemente il malinteso contro cui la documentazione di gcc mette in guardia.
AProgrammatore

Fisso. Ma in pratica sembra piuttosto un "più di" e non "alcuni".
Kirill V. Lyadvinsky
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.