Disabilitare selettivamente gli avvisi GCC solo per una parte di un’unità di traduzione?

Qual è l’equivalente GCC più simile a questo codice del preprocessore 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. 

Abbiamo codice nelle intestazioni comunemente incluse che non vogliamo generare un avvertimento specifico. Tuttavia, vogliamo che i file che includono tali intestazioni continuino a generare tale avviso (se il progetto ha abilitato tale avviso).

Questo è ansible in GCC dalla versione 4.6, o intorno a giugno 2010 nel bagagliaio.

Ecco un esempio:

 #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 */ 

La cosa più vicina è il pragma diagnostico GCC , #pragma GCC diagnostic [warning|error|ignored] "-Wwhatever" . Non è molto vicino a quello che vuoi, e vedi il link per dettagli e avvertimenti.

Ho fatto qualcosa di simile. Per il codice di terze parti, non volevo vedere alcun avviso. Quindi, piuttosto che specificare -I/path/to/libfoo/include , ho usato -isystem /path/to/libfoo/include . Questo fa sì che il compilatore tratti questi file di intestazione come “intestazioni di sistema” ai fini degli avvertimenti, e fino a quando non abiliti le -Wsystem-headers , sei quasi sicuro. Ho visto ancora alcuni avvisi fuoriuscire da lì, ma riduce la maggior parte della spazzatura.

Nota che questo ti aiuta solo se puoi isolare il codice incriminato da include-directory. Se è solo un sottoinsieme del tuo progetto, o mescolato con altro codice, sei sfortunato.

Questa è un’espansione alla risposta di Matt Joiner .

Se non vuoi generare pragmi in tutto il tuo codice, puoi usare l’ operatore _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