Выборочно отключить предупреждения 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. 

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

    Это возможно в 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 
    Давайте будем гением компьютера.