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-value
a -Wno-unused-value
jednak 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 -Wall
przesłania mój cel?
c++
gcc
compiler-warnings
compiler-flags
WilliamKF
źródło
źródło
-Werror=no-unused-variable
Odpowiedzi:
-Wno-unused-variable
Przełą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
-isystem
zamiast-I
for 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!
źródło
-Wno-unused-parameter
dla nieużywanych parametrów funkcji,-Wno-unused-function
dla nieużywanej funkcji-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
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 ... :)
źródło
void func(unsigned number, const int)
. Wtedy gcc również nie będzie narzekać na nieużywaneversion
.gcc
używanej wersji. IIRC, musiałem go użyć te 4 lata temu, aby stłumić ostrzeżenia o nieużywanymversion
. ;)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.źródło
#pragma
Dyrektywy @ 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#pragma
s.Zobacz w
man gcc
sekcji Opcje ostrzeżeń. Masz całą masę plikówunused
Jeśli poprzedzisz którekolwiek z nich przedrostkiem
no-
, wyłączy to ostrzeżenie.Bardziej szczegółowe wyjaśnienie można znaleźć w sekcji Opcje żądania lub wyłączania ostrzeżeń
źródło
Użycie
-Wno-unused-variable
powinno działać.źródło
-Wno-error=unused-variable
jeśli chcesz usunąć błąd i zachować ostrzeżenie.[-Werror=unused-variable]
.Kompilator już ci mówi, że nie jest
value
alevariable
. Szukasz-Wno-unused-variable
. Spróbujg++ --help=warnings
też zobaczyć listę dostępnych opcji.źródło
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.
źródło
-Wall
i-Wextra
ustawia scenę w GCC, a kolejne-Wno-unused-variable
mogą 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 -Wextra
i 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ą.
źródło
export IGNORE_WARNINGS=1
Wyświetla ostrzeżenia, ale kontynuuje kompilację
źródło