Selektywnie wyłącza Ostrzeżenia GCC tylko dla części jednostki tłumaczeniowej?

Jaki jest najbliższy odpowiednik GCC dla 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 powszechnie dołączanych nagłówkach, których nie chcemy generować. Chcemy jednak, aby pliki zawierające te nagłówki nadal generowały to Ostrzeżenie (jeśli projekt ma włączone to Ostrzeżenie).

Author: Trevor Boyd Smith, 2009-06-08

4 answers

Jest to możliwe w GCC od wersji 4.6, czyli około czerwca 2010 roku 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 */
 90
Author: Matt Joiner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-20 02:00:42

Najbliższą rzeczą jest pragma diagnostyczna GCC, #pragma GCC diagnostic [warning|error|ignored] "-Wwhatever". To nie jest bardzo blisko tego, co chcesz, i zobacz link dla szczegółów i zastrzeżeń.

 34
Author: chaos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-08 14:28:21

Zrobiłem coś podobnego. W przypadku kodu stron trzecich nie chciałem widzieć żadnych ostrzeżeń. Zamiast więc podać -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" do celów ostrzeżeń i dopóki nie włączysz -Wsystem-headers, jesteś w większości Bezpieczny. Nadal widziałem kilka ostrzeżeń wyciekających stamtąd, ale to zmniejsza większość śmieci.

Zauważ, że ten tylko pomoże ci, jeśli możesz wyizolować Kod przez include-directory. Jeśli jest to tylko podzbiór własnego projektu lub zmieszany z innym kodem, masz pecha.

 32
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-22 01:19:18

Jest to rozszerzenie do Odpowiedzi Matta Joinera .

Jeśli nie chcesz rozrzucać pragmatów na całym swoim kodzie, możesz użyć _pragma operatora :

#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
 1
Author: Cássio Renan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-02 16:32:20