Mam projekt, który używa bibliotek log4cxx, boost itp., Których nagłówki generują wiele (powtarzających się) ostrzeżeń. Czy istnieje sposób na pominięcie ostrzeżeń z dołączeń biblioteki (np. #Include <some-header.h>) lub z niektórych ścieżek? Chciałbym jak zwykle użyć -Wall i / lub -Wextra w kodzie projektu bez zasłaniania odpowiednich informacji. Obecnie używam grep do tworzenia wyjścia, ale chciałbym coś lepszego.
126
extern "C"
, co prowadzi do dziwnych błędów związanych z łączeniem C, jeśli#include
w-isystem
ścieżce znajduje się nagłówek C ++ .W przypadku osób używających CMake można zmodyfikować
include_directories
dyrektywy, aby zawierały symbol,SYSTEM
który pomija ostrzeżenia przed takimi nagłówkami.źródło
${LIBFOO_USE_FILE}
zmienną, która ma być używana z poleceniem include () CMake ?easylogging++
i otrzymuję tę samą ogromną liczbę ostrzeżeń z,easylogging++.h
mimo że folder, w którym się znajduje, został uwzględniony wSYSTEM
opcji.Możesz użyć pragm. Na przykład:
źródło
gcc
cl
ma tę zdolność od lat ... Czasamigcc
adaptacja jest nieco powolna.Znalazłem sztuczkę. Biblioteka zawiera, zamiast
-Idir
używać-isystem dir
w pliku makefile. GCC traktuje wtedy wzmocnienie itp., Ponieważ system zawiera i ignoruje wszelkie ostrzeżenia z nich.źródło
#pragma
są instrukcjami dla kompilatora. możesz ustawić coś przed #include i wyłączyć to po.Możesz to również zrobić w wierszu poleceń .
Kolejna strona GCC poświęcona wyłączaniu ostrzeżeń .
Wybrałbym opcję użycia # pragma w kodzie źródłowym, a następnie podanie rozsądnego powodu (jako komentarz), dlaczego wyłączasz ostrzeżenia. Oznaczałoby to rozumowanie dotyczące plików nagłówkowych.
GCC podchodzi do tego, klasyfikując typy ostrzeżeń. Możesz je sklasyfikować jako ostrzeżenia lub do zignorowania. Artykuły, do których prowadzą linki, pokazują, które ostrzeżenia mogą być wyłączone.
Uwaga: możesz również masować kod źródłowy, aby zapobiec niektórym ostrzeżeniom, używając atrybutów ; jednakże wiąże cię to dość mocno z GCC.
Uwaga 2: GCC używa również interfejsu pop / push, który jest używany w kompilatorze firmy Microsoft - Microsoft wyłącza ostrzeżenia za pośrednictwem tego interfejsu. Proponuję zbadać to dokładniej, ponieważ nie wiem, czy jest to w ogóle możliwe.
źródło
Możesz spróbować użyć prekompilowanych nagłówków . Ostrzeżenia nie znikną, ale przynajmniej nie pojawią się w twojej głównej kompilacji.
źródło
-isystem
, ale pamiętaj, aby użyć go zarówno podczas kompilowania nagłówka, jak i kodu)Jeśli chcesz jawnie przesłonić nagłówek systemowy, jesteś ograniczony do pragm. Możesz sprawdzić, które obejmuje używasz, za pomocą
make depend
danych wyjściowych.Zobacz także diagnostyczne push-pop dla gcc> = 4.6
źródło
Umieszczając następujące
wyłączy ostrzeżenia GCC dla całego następującego kodu w tym pliku.
źródło
Muszą być powody dla tych ostrzeżeń. Będą one spowodowane błędami w kodzie korzystającym z biblioteki lub błędami w samym kodzie biblioteki. W pierwszym przypadku napraw kod. W drugim przypadku albo przestań używać biblioteki, albo, jeśli jest to kod FOSS, napraw to.
źródło