Какой 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 */
источник
#pragma GCC diagnostic [error|warning|ignored]
ноpop
он не реализован / не поддерживается.Ближе всего является диагностическим Прагма GCC ,
#pragma GCC diagnostic [warning|error|ignored] "-Wwhatever"
. Это не очень похоже на то, что вы хотите, и см. Ссылку для получения подробностей и предупреждений.источник
#pragma
директиву, поэтому все, что специфично для GCC, вероятно, будет реализовано как__attribute__((foo))
.#pragma GCC push_options
так что вы можете возитьсяЯ сделал нечто подобное. Для стороннего кода я вообще не хотел видеть никаких предупреждений. Поэтому вместо того, чтобы указывать
-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
источник