Jaki jest najbliższy odpowiednik GCC do tego kodu preprocesora MSVC?
#pragma warning( push ) // Save the current warning state.
#pragma warning( disable : 4723 ) // C4723: potential divide by 0
// Code which would generate warning 4723.
#pragma warning( pop ) // Restore warnings to previous state.
Mamy kod w często dołączanych nagłówkach, których nie chcemy generować specjalnego ostrzeżenia. Chcemy jednak, aby pliki zawierające te nagłówki nadal generowały to ostrzeżenie (jeśli projekt ma włączone to ostrzeżenie).
Odpowiedzi:
Jest to możliwe w GCC od wersji 4.6 lub około czerwca 2010 w bagażniku.
Oto przykład:
#pragma GCC diagnostic push #pragma GCC diagnostic error "-Wuninitialized" foo(a); /* error is given for this one */ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wuninitialized" foo(b); /* no diagnostic for this one */ #pragma GCC diagnostic pop foo(c); /* error is given for this one */ #pragma GCC diagnostic pop foo(d); /* depends on command line options */
źródło
#pragma GCC diagnostic [error|warning|ignored]
alepop
nie jest zaimplementowany / obsługiwany.Najbliższy rzeczą jest Pragma diagnostyczny GCC ,
#pragma GCC diagnostic [warning|error|ignored] "-Wwhatever"
. Nie jest bardzo zbliżony do tego, czego chcesz, i zobacz link, aby uzyskać szczegółowe informacje i zastrzeżenia.źródło
#pragma
dyrektywy, więc wszystko, co jest specyficzne dla GCC, prawdopodobnie zostanie zaimplementowane jako__attribute__((foo))
.#pragma GCC push_options
więc możesz grzebać wZrobiłem coś podobnego. W przypadku kodu innej firmy nie chciałem w ogóle widzieć żadnych ostrzeżeń. Więc zamiast określać
-I/path/to/libfoo/include
, użyłem-isystem /path/to/libfoo/include
. To sprawia, że kompilator traktuje te pliki nagłówkowe jako „nagłówki systemowe” na potrzeby ostrzeżeń i dopóki tego nie włączysz-Wsystem-headers
, jesteś w większości bezpieczny. Wciąż widziałem wyciekające stamtąd kilka ostrzeżeń, ale ogranicza to większość śmieci.Zauważ, że jest to pomocne tylko wtedy, gdy możesz wyodrębnić niewłaściwy kod za pomocą katalogu include. Jeśli jest to tylko podzbiór twojego własnego projektu lub zmieszany z innym kodem, nie masz szczęścia.
źródło
To jest rozszerzenie odpowiedzi Matta Joinera .
Jeśli nie chcesz odradzać pragm w całym kodzie, możesz użyć operatora _Pragma :
#ifdef __GNUC__ # define DIAGNOSTIC_ERROR(w) _Pragma("GCC diagnostic error \"" w "\"") # define DIAGNOSTIC_IGNORE(w) _Pragma("GCC diagnostic ignore \"" w "\"") # define DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") # define DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") #endif // (...) DIAGNOSTIC_ERROR("-Wuninitialized") foo(a); // Error DIAGNOSTIC_PUSH DIAGNOSTIC_IGNORE("-Wuninitialized") foo(a); // No error DIAGNOSTIC_POP foo(a); // Error
źródło