2009-06-08 13 views
79

Qual è l'equivalente GCC più simile a questo codice del preprocessore MSVC?Disabilita selettivamente gli avvisi GCC solo per una parte di un'unità di traduzione?

#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).

+0

Se le intestazioni sono installati in/usr/include o quello che hai gcc non genera avvisi per loro per impostazione predefinita. – Spudd86

risposta

86

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

Ecco un esempio:

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

La funzionalità push e pop è stata aggiunta in gcc 4.6 (http://gcc.gnu.org/onlinedocs/gcc-4.6.0/gcc/Diagnostic-Pragmas.html). –

+0

Probabilmente vorrai premere due volte se stai andando a farmi due volte. – Dan

+1

@Dan: leggi il manuale e commenta. Annota l'origine dell'esempio. –

34

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

+1

Sai cosa e dove potrebbe essere la motivazione per non aggiungere questa funzione? (Non riuscivo a trovarlo.) Trovo utile l'avviso push-disable-pop. –

+1

Non immagino che "non aggiungere funzionalità" a gcc tenda ad avere una motivazione logica tanto quanto l'assenza di chiunque invii una patch di lavoro. – chaos

+13

Non è che nessuno è disposto a fare il lavoro per questo tipo di controllo di avvertimento a grana fine in gcc, o presentare il codice - so di un'importante società della Silicon Valley che già lo ha fatto, e un altro che sarebbe stato lieto di pagare qualcuno a farlo e ottenere il codice nel flusso. Piuttosto, per una discussione con un ragazzo che (come uno dei manutentori di gdb) è collegato a questa roba, i manutentori di gcc hanno una filosofia: "Se c'è un avvertimento, è un bug, e devi sistemarlo." Quindi (imo) è un argomento religioso, e controllano il codice in modo che vincano. –

31

Ho fatto qualcosa di simile. Per il codice di terze parti, non volevo vedere alcun avviso. Quindi, anziché specificare -I/path/to/libfoo/include, ho utilizzato -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 lo -Wsystem-headers, per la maggior parte sei al sicuro. Ho visto ancora alcuni avvisi fuoriuscire da lì, ma riduce la maggior parte della spazzatura.

Si noti che questo solo aiuta se è possibile isolare il codice all'origine da include-directory. Se è solo un sottoinsieme del tuo progetto, o mescolato con altro codice, sei sfortunato.

+1

Semplice ed efficace, grazie mille! – GvS

+1

Ottimo consiglio. Se si utilizza LLVM, aggiungere il flag -isystem in "Altri flag C" nella sezione "Apple LLVM Compiler - Language". – Nestor

+0

@ Tom Grazie per la condivisione. Non riesco a capire dove usare la tua soluzione. Puoi dire un po 'di più? –

Problemi correlati