Como você desativa os avisos de variáveis ​​não utilizadas provenientes do gcc no código de terceiros que não desejo editar?

93

Gostaria de saber que opção você passa para o compilador gcc para desligar os avisos de variáveis ​​não utilizadas. Estou recebendo erros do boost no windows e não quero mexer no código do boost:

C:\boost_1_52_0/boost/system/error_code.hpp: At global scope:
C:\boost_1_52_0/boost/system/error_code.hpp:214:36: error: 'boost::system::posix_category' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:215:36: error: 'boost::system::errno_ecat' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:216:36: error: 'boost::system::native_ecat' defined but not used [-Werror=unused-variable]

Tentei usar ambos -Wunused-valuee, -Wno-unused-valuemas nenhum suprimiu as mensagens acima.

Qual é o comando correto, aqui está minha linha de compilação:

g++  -g -fno-inline -Wall -Werror -Wextra -Wfloat-equal -Wshadow
-Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wno-conversion 
-Wdisabled-optimization -Wredundant-decls -Wunused-value -Wno-deprecated 
-IC:\\boost_1_52_0 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 
-c -o op.o op.cpp

Talvez o -Wallsupere meu objetivo?

WilliamKF
fonte
Como a mensagem de erro mais ou menos diz, tente-Werror=no-unused-variable
Joachim Isaksson

Respostas:

236

A -Wno-unused-variabletroca geralmente funciona. No entanto, esse é um aviso muito útil se você se preocupa com essas coisas em seu projeto. Porém, torna-se irritante quando o GCC começa a avisá-lo sobre coisas que não estão em seu código.

Eu recomendaria que você mantivesse o aviso ativado, mas use em -isystemvez de -Ipara incluir diretórios de projetos de terceiros. Essa bandeira diz ao GCC para não avisá-lo sobre as coisas sobre as quais você não tem controle.

Por exemplo, em vez de -IC:\\boost_1_52_0, digamos -isystem C:\\boost_1_52_0.

Espero que ajude. Boa sorte!


fonte
Onde adicionar essa configuração? Fiz isso em "Configurações do projeto / Compilador AVR GNU C / Diversos", mas será ignorado (o caminho está correto, ainda recebe avisos). Ao adicionar isso às configurações do diretório (desmarque a caixa de seleção do caminho relativo), o AtmelStudio irá travar.
hfrmobile
3
também temos -Wno-unused-parameterpara parâmetros de função não utilizados, -Wno-unused-functionpara função não utilizada
Ngo Thanh Nhan
1
Você precisa de:-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
Ronny Sherer,
81

Às vezes, você só precisa suprimir alguns avisos e deseja manter outros avisos, apenas por segurança. Em seu código, você pode suprimir os avisos de variáveis ​​e até mesmo parâmetros formais usando o atributo não utilizado do GCC . Digamos que você tenha este snippet de código:

void func(unsigned number, const int version)
{
  unsigned tmp;
  std::cout << number << std::endl;
}

Pode haver uma situação em que você precise usar esta função como um manipulador - o que (imho) é bastante comum na biblioteca C ++ Boost. Em seguida, você precisa da segunda versão formal do parâmetro , de modo que a assinatura da função seja a mesma que o modelo que o manipulador requer, caso contrário, a compilação falhará. Mas você realmente não precisa disso na função em si ...

A solução para marcar a variável ou o parâmetro formal a ser excluído dos avisos é esta:

void func(unsigned number, const int version __attribute__((unused)))
{
  unsigned tmp __attribute__((unused));
  std::cout << number << std::endl;
}

O GCC tem muitos outros parâmetros, você pode verificá-los nas páginas de manual . Isso também funciona para programas C, não apenas C ++, e acho que pode ser usado em quase todas as funções, não apenas em manipuladores. Vá em frente e experimente! ;)

PS: Recentemente, usei isso para suprimir avisos de serialização de Boosts no modelo como este:

template <typename Archive>
void serialize(Archive &ar, const unsigned int version __attribute__((unused)))

EDIT: Aparentemente, eu não respondi sua pergunta conforme você precisava, drak0sha fez melhor. É porque eu segui principalmente o título da pergunta, meu mal. Esperançosamente, isso pode ajudar outras pessoas, que chegam aqui por causa desse título ... :)

Dee'Kej
fonte
7
Para parâmetros formais, você pode omitir o nome, por exemplo void func(unsigned number, const int). Então, o gcc também não reclamará do não uso version.
Olaf Dietsche
@OlafDietsche Acho que isso depende da gccversão que você está usando. IIRC, eu tive que usá-lo 4 anos atrás, para suprimir avisos sobre não usados version. ;)
Dee'Kej
66

Se você estiver usando o gcc e quiser desativar o aviso do código selecionado, poderá usar a diretiva do compilador #pragma:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
( your problematic library includes )
#pragma GCC diagnostic pop

Para o código que você controla, você também pode usar __attribute__((unused))para instruir o compilador que variáveis ​​específicas não são usadas.

Ole Wolf
fonte
Geralmente, eu diria que usar as diretivas #pragma não é muito seguro, a menos que você realmente saiba o que está fazendo ou esteja usando, por exemplo, o OpenMP para paralelização ...;)
Dee'Kej
1
As #pragmadiretivas @ Dee'Kej são perfeitamente seguras se você envolvê-las #ifdef some_compiler ... #endif. Os avisos são um recurso específico do compilador e não são definidos pelo padrão. Você não pode suprimir nenhum aviso do código sem #pragmas.
Kotauskas
@ vladislav-toncharov Você está certo sobre os avisos serem específicos do compilador. Mas não estamos falando sobre avisos do compilador em geral aqui - estamos falando especificamente sobre o GCC. Você também está correto sobre #pragma não ser prejudicial por dizer. No entanto, muitas pessoas da OMI não sabem usar corretamente o #pragma, e é por isso que considero "perigoso" (por falta de palavras melhores).
Dee'Kej
15

Veja man gccem Opções de Aviso. Lá você tem um monte deunused

Opções de aviso
... -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wunused-but-set-parameter -Wunused-but-set-variable

Se você prefixar qualquer um deles com no-, esse aviso será desativado.

Muitas opções têm nomes longos começando com -f ou com -W --- por exemplo, -fmove-loop-invariants, -Wformat e assim por diante. A maioria deles tem formas positivas e negativas; a forma negativa de -ffoo seria -fno-foo. Este manual documenta apenas um desses dois formulários, o que não for o padrão.

Uma explicação mais detalhada pode ser encontrada em Opções para solicitar ou suprimir avisos

Olaf Dietsche
fonte
Não sabia que posso prefixar "não-" com avisos.
RNA
10

O uso -Wno-unused-variabledeve funcionar.

Mats Petersson
fonte
Ahh, variável não usada, não valor não usado!
WilliamKF
5
Ou -Wno-error=unused-variablese você deseja remover o erro e manter o aviso.
Oskar N.
1
Você pode realmente ver qual é o aviso real [-Werror=unused-variable].
Mats Petersson
3

O compilador já está dizendo a você, não é valuemas variable. Você está procurando -Wno-unused-variable. Além disso, tente g++ --help=warningsver uma lista de opções disponíveis.

Daniel Frey
fonte
3

Como você desativa os avisos de variáveis ​​não utilizadas provenientes do gcc?
Estou recebendo erros de boost no windows e não quero mexer no código de boost ...

Você visita o Trac do Boost e arquiva um relatório de bug contra o Boost.

Seu aplicativo não é responsável por limpar avisos e erros da biblioteca. A biblioteca é responsável por limpar seus próprios avisos e erros.

jww
fonte
0

-Walle -Wextradefine o cenário no GCC e o subsequente -Wno-unused-variablepode não ter efeito. Por exemplo, se você tem:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -Wall -Wextra \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ -Wno-unused-parameter \ -Wno-unused-variable \ $(INC)

então o GCC vê a instrução -Wall -Wextrae parece ignorar-Wno-unused-variable

Em vez disso, pode ter a seguinte aparência abaixo e você obtém o efeito desejado de não ser interrompido em sua compilação na variável não utilizada:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ $(INC)

Há um bom motivo para ser chamado de "aviso" em vez de "erro". Deixar de compilar apenas porque seu código não está completo (digamos que você está removendo o algoritmo) pode ser frustrante.

William Cerniuk
fonte
-3
export IGNORE_WARNINGS=1

Ele exibe avisos, mas continua com a construção

Sifiso Myeni
fonte