Come si disabilitano gli avvisi di variabili inutilizzati provenienti da gcc nel codice di terze parti che non desidero modificare?


93

Vorrei sapere quale interruttore si passa al compilatore gcc per disattivare gli avvisi delle variabili inutilizzate? Ricevo errori da boost su Windows e non voglio toccare il codice 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]

Ho provato a usare entrambi -Wunused-valuee -Wno-unused-valuema nessuno dei due ha soppresso i messaggi sopra.

Qual è il comando giusto, ecco la mia riga di compilazione:

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

Forse l' -Walloverride del mio obiettivo?


Come dice più o meno il messaggio di errore, prova-Werror=no-unused-variable
Joachim Isaksson,

Risposte:


236

L' -Wno-unused-variableinterruttore di solito fa il trucco. Tuttavia, questo è davvero un avvertimento molto utile se ti interessano queste cose nel tuo progetto. Diventa fastidioso quando GCC inizia ad avvisarti di cose non presenti nel tuo codice.

Ti consiglio di mantenere attivo l'avviso, ma usa -isysteminvece di -Iincludere directory di progetti di terze parti. Quel flag dice a GCC di non avvisarti delle cose su cui non hai controllo.

Ad esempio, invece di -IC:\\boost_1_52_0, diciamo -isystem C:\\boost_1_52_0.

Spero che sia d'aiuto. In bocca al lupo!


Dove aggiungere questa impostazione? Lo ha fatto in "Impostazioni progetto / AVR GNU C Compiler / Varie" ma verrà ignorato (il percorso è corretto, vengono comunque visualizzati gli avvisi) Quando lo si aggiunge alle impostazioni della directory (deselezionare la casella di controllo del percorso relativo) AtmelStudio andrà in crash.
hfrmobile

3
abbiamo anche -Wno-unused-parameterper i parametri di funzione inutilizzati, -Wno-unused-functionper la funzione inutilizzata
Ngo Thanh Nhan

1
Hai bisogno di:-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
Ronny Sherer

81

A volte è sufficiente sopprimere solo alcuni avvisi e si desidera mantenere altri avvisi, solo per sicurezza. Nel tuo codice, puoi sopprimere gli avvisi per le variabili e persino i parametri formali utilizzando l' attributo inutilizzato di GCC . Diciamo che hai questo snippet di codice:

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

Potrebbe esserci una situazione in cui è necessario utilizzare questa funzione come gestore, che (imho) è abbastanza comune nella libreria C ++ Boost. Quindi è necessaria la seconda versione del parametro formale , quindi la firma della funzione è la stessa del modello richiesto dal gestore, altrimenti la compilazione fallirebbe. Ma non ne hai davvero bisogno nemmeno nella funzione stessa ...

La soluzione per contrassegnare la variabile o il parametro formale da escludere dagli avvisi è questa:

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

GCC ha molti altri parametri, puoi controllarli nelle pagine man . Questo funziona anche per i programmi C, non solo C ++, e penso che possa essere utilizzato in quasi tutte le funzioni, non solo nei gestori. Vai avanti e provalo! ;)

PS: Ultimamente l'ho usato per sopprimere gli avvisi di serializzazione di Boosts in template come questo:

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

EDIT: Apparentemente, non ho risposto alla tua domanda come ti serviva, drak0sha l'ha fatto meglio. È perché ho seguito principalmente il titolo della domanda, colpa mia. Si spera che questo possa aiutare altre persone che arrivano qui grazie a quel titolo ... :)


7
Per i parametri formali, puoi omettere il nome, ad es void func(unsigned number, const int). Quindi, anche gcc non si lamenterà di inutilizzati version.
Olaf Dietsche

@OlafDietsche Penso che questo dipenda dalla gccversione che stai usando. IIRC, ho dovuto usarlo 4 anni fa, per sopprimere gli avvertimenti sui non utilizzati version. ;)
Dee'Kej

66

Se stai usando gcc e vuoi disabilitare l'avviso per il codice selezionato, puoi usare la direttiva del compilatore #pragma:

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

Per il codice che controlli, puoi anche usare __attribute__((unused))per istruire il compilatore che non vengono utilizzate variabili specifiche.



In generale, direi che usare le direttive #pragma non è molto sicuro, a meno che tu non sappia davvero cosa stai facendo, o non stai usando ad esempio OpenMP per la parallelizzazione ...;)
Dee'Kej

1
@ Le #pragmadirettive Dee'Kej sono perfettamente sicure se le includi #ifdef some_compiler ... #endif. Gli avvisi sono una funzionalità specifica del compilatore e non sono definiti dallo standard. Non puoi sopprimere alcun avviso dal codice senza #pragmas.
Kotauskas

@ vladislav-toncharov Hai ragione riguardo agli avvisi che sono specifici del compilatore. Ma non stiamo parlando di avvertimenti del compilatore in generale qui, stiamo parlando specificamente di GCC. Hai anche ragione sul fatto che #pragma non sia dannoso per dire. Tuttavia, IMO molte persone non sanno come usare correttamente #pragma, ed è per questo che lo considero "pericoloso" (per la mancanza di parole migliori).
Dee'Kej

15

Vedere man gccin Opzioni di avviso. Eccoti un sacco diunused

Opzioni di avviso
... -Wunused -Funzione -Wunused -etichetta -Wunused -Parametro -Wunused -Valore -Wunused -Variabile -Wunused -Wunused-but-set-parameter -Wunused-but-set-variable

Se anteponi uno di loro con no-, disabiliterà questo avviso.

Molte opzioni hanno nomi lunghi che iniziano con -f o con -W --- per esempio, -fmove-loop-invariants, -Wformat e così via. La maggior parte di questi ha forme sia positive che negative; la forma negativa di -ffoo sarebbe -fno-foo. Questo manuale documenta solo uno di questi due moduli, a seconda di quale non è quello predefinito.

Una spiegazione più dettagliata può essere trovata in Opzioni per richiedere o sopprimere gli avvisi


Non sapevo di poter far precedere "no-" con eventuali avvisi.
RNA

10

L'uso -Wno-unused-variabledovrebbe funzionare.


Ahh, variabile inutilizzata, non valore inutilizzato!
WilliamKF

5
O -Wno-error=unused-variablese vuoi rimuovere l'errore e mantenere l'avviso.
Oskar N.

1
Puoi effettivamente vedere qual è l'avvertimento effettivo [-Werror=unused-variable].
Mats Petersson

3

Il compilatore ti sta già dicendo, non lo è valuema variable. Stai cercando -Wno-unused-variable. Inoltre, prova g++ --help=warningsa vedere un elenco delle opzioni disponibili.


3

Come si disabilitano gli avvisi di variabili inutilizzati provenienti da gcc?
Ricevo errori da boost su Windows e non voglio toccare il codice boost ...

Visiti Boost's Trac e invii una segnalazione di bug contro Boost.

L'applicazione non è responsabile della cancellazione degli avvisi e degli errori della libreria. La libreria è responsabile della cancellazione dei propri avvisi ed errori.


0

-Walle -Wextrapone le basi in GCC e il successivo -Wno-unused-variablepotrebbe non avere effetto. Ad esempio, se hai:

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)

quindi GCC vede l'istruzione -Wall -Wextrae sembra ignorarla-Wno-unused-variable

Questo può invece apparire come questo di seguito e si ottiene l'effetto desiderato di non essere fermati nella compilazione sulla variabile inutilizzata:

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

C'è una buona ragione per cui viene chiamato "avviso" rispetto a "errore". Fallire la compilazione solo perché il codice non è completo (diciamo che stai bloccando l'algoritmo) può essere sconfitto.


-3
export IGNORE_WARNINGS=1

Visualizza gli avvisi, ma continua con la compilazione

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.