Qual é o GCC mais próximo equivalente a este código de pré-processador 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.
Temos código em cabeçalhos comumente incluídos, os quais não queremos gerar um aviso específico. No entanto, queremos que os arquivos que incluem esses cabeçalhos continuem a gerar esse aviso (se o projeto tiver esse aviso habilitado).
Respostas:
Isso é possível no GCC desde a versão 4.6 ou por volta de junho de 2010 no tronco.
Aqui está um exemplo:
#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 */
fonte
#pragma GCC diagnostic [error|warning|ignored]
mas opop
não é implementado / suportado.A coisa mais próxima é o pragma diagnóstico GCC ,
#pragma GCC diagnostic [warning|error|ignored] "-Wwhatever"
. Não está muito perto do que você deseja e consulte o link para obter detalhes e advertências.fonte
#pragma
diretiva, portanto, qualquer coisa que seja específica do GCC provavelmente será implementada como um__attribute__((foo))
.#pragma GCC push_options
para que você possa mexer com mais do que apenas diagnósticos ... gcc.gnu.org/onlinedocs/gcc/…Eu fiz algo semelhante. Para código de terceiros, eu não queria ver nenhum aviso. Então, em vez de especificar
-I/path/to/libfoo/include
, usei-isystem /path/to/libfoo/include
. Isso faz com que o compilador trate esses arquivos de cabeçalho como "cabeçalhos do sistema" para fins de avisos e, desde que você não os habilite-Wsystem-headers
, estará seguro. Ainda vi alguns avisos vazarem de lá, mas eliminam a maior parte do lixo.Observe que isso só ajuda se você puder isolar o código ofensivo por diretório de inclusão. Se for apenas um subconjunto do seu próprio projeto, ou misturado com outro código, você está sem sorte.
fonte
Esta é uma expansão da resposta de Matt Joiner .
Se você não deseja gerar pragmas em todo o seu código, pode usar o operador _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
fonte