O que “-Wall” em “g ++ -Wall test.cpp -o test” faz?

93

-o muda o nome do arquivo de saída (descobri isso usando --help)

Mas não consigo descobrir o que -Wallfaz?

Steven
fonte
7
"man gcc" em seu console informa tudo sobre este sinalizador e uma simples pesquisa no Google com "gcc -Wall" também ...
David Sauter
Como dica geral, tente ler as manentradas dos programas se quiser saber o que um switch faz ou quais switches estão disponíveis. A manpágina de gccpode ser lida em linux.die.net/man/1/gcc - você pode fazer uma busca rápida lá pelo texto "
-Wall
6
@David Sauter, o Google não encontrará nada com "-wall". Isso excluirá todas as "paredes" da pesquisa.
Kirill V. Lyadvinsky,
@Kirill Não se você usar aspas, como estou supondo que David quis dizer
gnud
1
//, sempre pensei que fosse uma homenagem ao Larry Wall.
Nathan Basanese,

Respostas:

111

É a abreviatura de "warn all" - ativa (quase) todos os avisos que o g ++ pode informar. Normalmente uma boa ideia, especialmente se você for um iniciante, porque entender e corrigir esses avisos pode ajudá-lo a corrigir muitos tipos diferentes de problemas em seu código.

MatrixFrog
fonte
25
Mais avisos (alguns dos quais são muito úteis) podem ser ativados com -Wextrae -pedantic.
gnud
7
Não é (quase) tudo. Na verdade, é apenas uma pequena fração dos avisos disponíveis. São aqueles com os quais "todos" concordam. O realmente boa idéia é fazer -Wall -Wextra, em seguida, examinar o manual para encontrar tantas mais avisos que você poderia permitir que possível, porque mesmo -Wextraé apenas um pequeno subconjunto ...
DevSolar
@DevSolar ponto muito bom. Você sabe se há uma bandeira que significa "literalmente todos os avisos"?
MatrixFrog
1
@MatrixFrog: Infelizmente, essa opção não existe, pelo menos não para os compiladores que conheço. E a lista de avisos disponíveis muda com o tempo ... se a equipe do GCC não tivesse desabilitado há -Wunreachable-codealgum tempo, a Apple estaria muito mais feliz hoje em dia. ;-)
DevSolar
39

Veja man gcc.

-Wall ativa estes avisos:

-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 contém:

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

Existem muitos outros avisos que você deve ativar explicitamente.

Por exemplo, para o nosso código C, usamos:

-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-declarations -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-macros -Wwrite-strings -Wc ++ -compat -Werror = declaração-após-declaração -Werror = declaração de função implícita -Wmissing-prototypes -Werror = nested-externs -Werror = definição de estilo antigo -Werror = protótipos estritos

ou apenas o conjunto de avisos com https://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html

rurban
fonte
19

Infelizmente, nenhuma das respostas está citando a parte realmente relevante do manual, o que realmente o leva a um ponto:

Isso permite todos os avisos sobre construções que alguns usuários consideram questionáveis ​​e que são fáceis de evitar (ou modificar para evitar o aviso), mesmo em conjunto com macros.

[...]

Observe que alguns sinalizadores de aviso não estão implícitos em -Wall. Alguns deles alertam sobre construções que os usuários geralmente não consideram questionáveis, mas que ocasionalmente você pode querer verificar; outros avisam sobre construções que são necessárias ou difíceis de evitar em alguns casos, e não há uma maneira simples de modificar o código para suprimir o aviso. Alguns deles são ativados por, -Wextra mas muitos deles devem ser ativados individualmente.

Logo:

  • -Wallnão faz significa "todos os avisos".
  • Também não significa "(quase) todos", nem de longe.
  • Ele não significa um conjunto de opções individuais que é obrigado a mudar .

Resumindo, trata-se do mínimo absoluto de avisos que você deve definir. Embora -Wall -Wextraseja melhor, ele ainda não está fazendo uso de todas as verificações de erros que seu compilador pode fazer por você.


Pessoalmente, eu não iria por menos de -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual. Todos os meus projetos atuais realmente usam uma lista de avisos mais longa do que isso (sem acionar nenhum deles). E eu verifico o manual em cada versão principal para novas opções. O compilador é seu amigo. Use todos os diagnósticos que ela puder oferecer.

DevSolar
fonte
Comecei a aprender programação em C ++. Estou usando princípios de programação e prática usando cpp . Meu sistema é ubuntu 16.04, eu uso o vscode como meu editor. Você me recomenda usar o seu -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtualenquanto compilo g++ -std=c++11enquanto aprendo c ++ e programação? Ou devo pular esta parte e começar a usar sinalizadores de mensagens de erro mais tarde? Em caso afirmativo, quando devo começar com as mensagens de erro?
scientific_explorer
2
@vkv: Eu acredito que o compilador é realmente seu amigo, e você deve tirar proveito de todos os bons conselhos que ele pode lhe dar.
DevSolar de
6

Permite avisos considerados úteis e fáceis de evitar na fonte pelos escritores do gcc. Há também -W (-Wextra em versões mais recentes) que são considerados úteis, mas para os quais contornar falsos positivos pode ser difícil ou resultar em código desajeitado.

O gcc também tem vários outros avisos, geralmente menos úteis. Consulte http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Warning-Options.html#Warning-Options

AProgrammer
fonte
2

isto enables most warning messages .

Você pode descobrir mais se usar g++ --help=warnings.

Yuval
fonte
0

Ele ativa todos os avisos. (lê-se como "Aviso a todos")

Bjorn J
fonte
Na verdade, existem muitos avisos que ele não habilita (como dtor não virtual em uma classe com métodos virtuais).
Mark B,
veja a resposta de Yuval: -Wallsignifica apenas "a maioria dos avisos" em vez de "todos os avisos".
HaxtraZ
-1

Mostra todos os avisos. Eu recomendaria também usar -pedanticpara alertar sobre algumas partes do código que não estão em conformidade.

Kirill V. Lyadvinsky
fonte
Para gcc doc: "Alguns usuários tentam usar -pedantic para verificar se os programas estão em conformidade estrita com o ISO C. Eles logo descobrem que ele não faz exatamente o que desejam: ele encontra algumas práticas não ISO, mas não todas - apenas aquelas para as quais ISO C requer um diagnóstico, e alguns outros para os quais diagnósticos foram adicionados. "
AProgrammer de
Não dá 100% de garantia, mas ajuda.
Kirill V. Lyadvinsky,
1
Se você não tivesse escrito some em vez de all in "para alertar sobre todas as partes não conformes", eu não teria comentado. Mas sua formulação atual apenas espalhou o equívoco contra o qual a documentação do gcc avisa.
AProgrammer de
Fixo. Mas, na prática, parece mais um "mais de" e não "alguns".
Kirill V. Lyadvinsky,