Выборочно отключить предупреждения GCC только для части единицы перевода?
-
12-09-2019 - |
Вопрос
Какой ближайший эквивалент GCC к этому коду препроцессора 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.
У нас есть код в обычно включенных заголовках, и мы не хотим генерировать конкретное предупреждение.Однако мы хотим, чтобы файлы, содержащие эти заголовки, продолжали генерировать это предупреждение (если в проекте это предупреждение включено).
Решение
Это возможно в GCC начиная с версии 4.6 или где-то с июня 2010 года в багажнике.
Вот пример:
#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 */
Другие советы
Самое близкое — это Диагностическая прагма GCC, #pragma GCC diagnostic [warning|error|ignored] "-Wwhatever"
.Это не очень близко к тому, что вы хотите, подробности и предостережения смотрите по ссылке.
Я сделал нечто подобное.Для стороннего кода я вообще не хотел видеть никаких предупреждений.Поэтому вместо того, чтобы указывать -I/path/to/libfoo/include
, Я использовал -isystem /path/to/libfoo/include
.Это заставляет компилятор рассматривать эти файлы заголовков как «системные заголовки» для выдачи предупреждений, и пока вы не включите -Wsystem-headers
, вы в основном в безопасности.Я все еще видел утечку нескольких предупреждений оттуда, но это сокращает большую часть мусора.
Обратите внимание, что это только поможет вам, если вы сможете изолировать код-нарушитель с помощью include-directory.Если это всего лишь часть вашего собственного проекта или смешанная с другим кодом, вам не повезло.
Это расширение для Ответ Мэтта Джойнера.
Если вы не хотите создавать прагмы по всему коду, вы можете использовать _Прагма-оператор:
#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