Jak wyłączyć ostrzeżenia o nieużywanych zmiennych wychodzące z gcc w kodzie strony trzeciej, którego nie chcę edytować?


94

Chciałbym wiedzieć, jaki przełącznik przekazujesz do kompilatora gcc, aby wyłączyć ostrzeżenia o nieużywanych zmiennych? W systemie Windows pojawiają się błędy i nie chcę dotykać kodu doładowania:

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]

Próbowałem za pomocą zarówno -Wunused-valuea -Wno-unused-valuejednak ani stłumione wiadomości powyżej.

Jakie jest właściwe polecenie, oto moja linia kompilacji:

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

Być może -Wallprzesłania mój cel?


Jak mniej więcej mówi komunikat o błędzie, spróbuj-Werror=no-unused-variable
Joachim Isaksson,

Odpowiedzi:


242

-Wno-unused-variablePrzełącznik zazwyczaj załatwia sprawę. Jest to jednak bardzo przydatne ostrzeżenie, jeśli zależy Ci na tych rzeczach w Twoim projekcie. Jednak staje się irytujące, gdy GCC zaczyna ostrzegać o rzeczach, których nie ma w kodzie.

Zalecałbym pozostawienie ostrzeżenia włączonego, ale -isystemzamiast -Ifor włączaj katalogi projektów innych firm. Ta flaga mówi GCC, aby nie ostrzegał Cię o rzeczach, nad którymi nie masz kontroli.

Na przykład zamiast -IC:\\boost_1_52_0, powiedz -isystem C:\\boost_1_52_0.

Mam nadzieję, że to pomoże. Powodzenia!


Gdzie dodać to ustawienie? Zrobiłem to w "Ustawieniach projektu / Kompilator AVR GNU C / Różne", ale zostanie zignorowane (ścieżka jest poprawna, nadal pojawiają się ostrzeżenia) Po dodaniu tego do ustawień katalogu (odznacz pole wyboru ścieżki względnej) AtmelStudio ulegnie awarii.
hfrmobile

3
mamy też -Wno-unused-parameterdla nieużywanych parametrów funkcji, -Wno-unused-functiondla nieużywanej funkcji
Ngo Thanh Nhan

1
Potrzebujesz:-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
Ronny Sherer

84

Czasami wystarczy stłumić tylko niektóre ostrzeżenia, a inne ostrzeżenia zachować dla bezpieczeństwa. W swoim kodzie możesz pominąć ostrzeżenia dla zmiennych, a nawet parametrów formalnych, używając nieużywanego atrybutu GCC . Powiedzmy, że masz ten fragment kodu:

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

Może zaistnieć sytuacja, w której będziesz potrzebować tej funkcji jako handlera - co (imho) jest dość powszechne w bibliotece C ++ Boost. Następnie potrzebna jest druga wersja parametru formalnego , więc podpis funkcji jest taki sam, jak szablon wymagany przez program obsługi, w przeciwnym razie kompilacja zakończy się niepowodzeniem. Ale tak naprawdę nie potrzebujesz go również w samej funkcji ...

Rozwiązanie, jak oznaczyć zmienną lub parametr formalny do wykluczenia z ostrzeżeń, jest następujące:

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

GCC ma wiele innych parametrów, możesz je sprawdzić na stronach podręcznika . Działa to również dla programów C, nie tylko C ++, i myślę, że może być używane w prawie każdej funkcji, nie tylko w programach obsługi. Śmiało i spróbuj! ;)

PS: Ostatnio użyłem tego do zniesienia ostrzeżeń o serializacji Boostów w szablonie w ten sposób:

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

EDYCJA: Najwyraźniej nie odpowiedziałem na twoje pytanie tak, jak potrzebujesz, drak0sha zrobił to lepiej. To dlatego, że głównie podążałem za tytułem pytania, mój błąd. Miejmy nadzieję, że pomoże to innym ludziom, którzy trafili tutaj z powodu tego tytułu ... :)


7
W przypadku parametrów formalnych można pominąć nazwę, np void func(unsigned number, const int). Wtedy gcc również nie będzie narzekać na nieużywane version.
Olaf Dietsche

@OlafDietsche Myślę, że to zależy od gccużywanej wersji. IIRC, musiałem go użyć te 4 lata temu, aby stłumić ostrzeżenia o nieużywanym version. ;)
Dee'Kej

67

Jeśli używasz gcc i chcesz wyłączyć ostrzeżenie dla wybranego kodu, możesz użyć dyrektywy kompilatora #pragma:

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

W przypadku kodu, który kontrolujesz, możesz również użyć __attribute__((unused))do poinstruowania kompilatora, że ​​określone zmienne nie są używane.



Generalnie powiedziałbym, że używanie dyrektyw #pragma nie jest zbyt bezpieczne, chyba że naprawdę wiesz, co robisz, lub używasz np. OpenMP do równoległości ...;)
Dee'Kej

1
#pragmaDyrektywy @ Dee'Kej są całkowicie bezpieczne, jeśli je opakujesz #ifdef some_compiler ... #endif. Ostrzeżenia są funkcją specyficzną dla kompilatora i nie są zdefiniowane w standardzie. Nie możesz wyłączyć żadnych ostrzeżeń z kodu bez #pragmas.
Kotauskas

@ vladislav-toncharov Masz rację, jeśli chodzi o ostrzeżenia specyficzne dla kompilatora. Ale nie mówimy tutaj ogólnie o ostrzeżeniach kompilatora - mówimy konkretnie o GCC. Masz również rację co do tego, że #pragma nie jest szkodliwa na słowo. Jednak w IMO wiele osób nie wie, jak poprawnie używać #pragma i dlatego uważam to za „niebezpieczne” (z braku lepszych słów).
Dee'Kej

15

Zobacz w man gccsekcji Opcje ostrzeżeń. Masz całą masę plikówunused

Opcje ostrzeżeń
... -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wunused-but-set-parameter -Wunused-but-set-variable

Jeśli poprzedzisz którekolwiek z nich przedrostkiem no-, wyłączy to ostrzeżenie.

Wiele opcji ma długie nazwy zaczynające się od -f lub od -W --- na przykład -fmove-loop-invariants, -Wformat i tak dalej. Większość z nich ma zarówno formy pozytywne, jak i negatywne; negatywną formą -ffoo byłoby -fno-foo. Ten podręcznik dokumentuje tylko jeden z tych dwóch formularzy, którykolwiek nie jest domyślny.

Bardziej szczegółowe wyjaśnienie można znaleźć w sekcji Opcje żądania lub wyłączania ostrzeżeń


Nie wiedziałem, że mogę poprzedzić „nie-” jakimikolwiek ostrzeżeniami.
RNA

10

Użycie -Wno-unused-variablepowinno działać.


Ahh, nieużywana zmienna, a nie nieużywana wartość!
WilliamKF,

5
Lub -Wno-error=unused-variablejeśli chcesz usunąć błąd i zachować ostrzeżenie.
Oskar N.

1
Możesz faktycznie zobaczyć, jakie jest rzeczywiste ostrzeżenie [-Werror=unused-variable].
Mats Petersson

3

Kompilator już ci mówi, że nie jest valueale variable. Szukasz -Wno-unused-variable. Spróbuj g++ --help=warningsteż zobaczyć listę dostępnych opcji.


3

Jak wyłączyć ostrzeżenia o nieużywanych zmiennych wychodzące z gcc?
W systemie Windows pojawiają się błędy i nie chcę dotykać kodu doładowania ...

Odwiedzasz Boost's Trac i zgłaszasz błąd dotyczący Boost.

Twoja aplikacja nie jest odpowiedzialna za usuwanie ostrzeżeń i błędów w bibliotece. Biblioteka jest odpowiedzialna za usuwanie własnych ostrzeżeń i błędów.


0

-Walli -Wextraustawia scenę w GCC, a kolejne -Wno-unused-variablemogą nie wejść w życie. Na przykład, jeśli masz:

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)

wtedy GCC widzi instrukcję -Wall -Wextrai wydaje się ją ignorować-Wno-unused-variable

Zamiast tego może to wyglądać jak poniżej i uzyskasz pożądany efekt nie zatrzymywania kompilacji na nieużywanej zmiennej:

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

Nie bez powodu nazywa się to „ostrzeżeniem” zamiast „błędem”. Niepowodzenie kompilacji tylko dlatego, że kod nie jest kompletny (powiedzmy, że eliminujesz algorytm) może być porażką.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.