Você não pode.
O manual do GCC 4.4.0 é abrangente apenas para essa versão, mas lista todos os avisos possíveis para o 4.4.0. Eles não estão todos na página para a qual você vincula, por exemplo, algumas opções específicas do idioma estão nas páginas de opções C ++ ou Obj-C. Para encontrá-los todos, é melhor consultar o Resumo das opções
Ligar tudo incluiria o -Wdouble-promotion
que é relevante apenas em CPUs com uma unidade de ponto flutuante de precisão única de 32 bits que implementa float
em hardware, mas simula double
em software. Fazendo cálculos como double
usaria a emulação de software e seria mais lento. Isso é relevante para algumas CPUs incorporadas, mas completamente irrelevante para as modernas CPUs de desktop com suporte de hardware para ponto flutuante de 64 bits.
Outro aviso que geralmente não é útil é -Wtraditional
, que alerta sobre códigos perfeitamente formados que têm um significado diferente (ou não funciona) nas "string " "concatenation"
definições tradicionais de C, por exemplo , ou ISO C! Você realmente se importa com a compatibilidade com compiladores de 30 anos? Você realmente quer um aviso para escrever int inc(int i) { return i+1; }
?
Eu acho que -Weffc++
é muito barulhento para ser útil, é baseado na primeira edição desatualizada do Effective C ++ e alerta sobre construções perfeitamente válidas em C ++ (e para as quais as diretrizes foram alteradas nas edições posteriores do livro.) Eu não quero ser avisei que não inicializei um std::string
membro no meu construtor; ele tem um construtor padrão que faz exatamente o que eu quero, por que devo escrever m_str()
para chamá-lo? Os -Weffc++
avisos que seriam úteis são muito difíceis para o compilador detectar com precisão (dando falsos negativos) e os que não são úteis, como inicializar explicitamente todos os membros, apenas produzem muito ruído, dando falsos positivos.
Luc Danton forneceu um ótimo exemplo de avisos inúteis, dos -Waggregate-return
quais quase certamente nunca faz sentido para o código C ++.
ou seja, você realmente não deseja todos os avisos, apenas pensa que deseja.
Leia o manual, leia sobre eles, decida qual você deseja ativar e tente. Ler o manual do seu compilador é uma Good Thing TM de qualquer maneira, tomar um atalho e ativar avisos que você não entende não é uma boa idéia, especialmente se for para evitar ter que usar o RTFM.
Quem simplesmente liga tudo provavelmente está fazendo isso porque não tem noção, porque ou um chefe de cabelos pontudos disse "sem avisos".
Alguns avisos são importantes e outros não. Você tem que ser discriminador ou estragar seu programa. Considere, por exemplo -Wdouble-promotion
,. Se você estiver trabalhando em um sistema incorporado, poderá querer isso; se você estiver trabalhando em um sistema desktop, provavelmente não. E você quer -Wtraditional
? Eu duvido.
Editar: Consulte também -Wall-all para ativar todos os avisos fechados como WONTFIX.
Edit 2: em resposta à reclamação do DevSolar sobre makefiles que precisam usar avisos diferentes dependendo da versão do compilador, se -Wall -Wextra
não for adequado, não será difícil usar CFLAGS específicos do compilador e da versão:
compiler_name := $(notdir $(CC))
ifeq ($(compiler_name),gcc)
compiler_version := $(basename $(shell $(CC) -dumpversion))
endif
ifeq ($(compile_name),clang)
compiler_version := $(shell $(CC) --version | awk 'NR==1{print $$3}')
endif
# ...
wflags.gcc.base := -Wall -Wextra
wflags.gcc.4.7 := -Wzero-as-null-pointer-constant
wflags.gcc.4.8 := $(wflags.gcc.4.7)
wflags.clang.base := -Wall -Wextra
wflags.clang.3.2 := -Weverything
CFLAGS += $(wflags.$(compiler_name).base) $(wflags.$(compiler_name).$(compiler_version))