Выборочное отключение предупреждений GCC только для части модуля перевода?

Какой ближайший эквивалент 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.

У нас есть код в обычно включаемых заголовках, который мы не хотим генерировать конкретное предупреждение. Однако мы хотим, чтобы файлы, содержащие эти заголовки, продолжали генерировать это предупреждение (если в проекте это предупреждение включено).

4 ответа

Решение

Это возможно в 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. Если это просто часть вашего собственного проекта или смешанный с другим кодом, вам не повезло.

Это дополнение к ответу Мэтта Джоунера.

Если вы не хотите создавать прагмы по всему коду, вы можете использовать оператор _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
Другие вопросы по тегам