2016-02-23 6 views
7

voglio sopprimere variadic avvertimento argomento macro GCC per zero argomenti, prodotti per esempio:Come sopprimere variadic avvertimento argomento macro GCC per zero argomenti per una particolare definizione di macro all'interno di un file sorgente

// for illustration purposes only: 
int foo(int i) { return 0; }; 
#define FOO(A, ...) foo(A, ##__VA_ARGS__) 
FOO(1); 
    ^warning: ISO C++11 requires at least one argument for the "..." in a variadic macro 

per un particolare definizione di macro all'interno di un file sorgente quando si utilizza GCC 5.3.0.

In clang questo è fatto come segue:

// ... large file 
#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments" 
#define FOO(A, ...) foo(A, ##__VA_ARGS__) 
#pragma clang diagnostic pop 
// ... large file 

// not necessary on the same file 
FOO(1); // doesnt trigger the warning 

In gcc Sembra -pedantic è una magica tipo di tipo di allarme in modo che il seguente non funziona:

// ... large file 
#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wpedantic" 
#define FOO(A, ...) foo(A, ##__VA_ARGS__) 
#pragma GCC diagnostic pop 
// ... large file 

Solo per essere chiari, l'avviso dovrebbe essere abilitato nell'intero programma tranne in questo particolare frammento di codice. Si tratta di controllo a grana fine. Disabilitare l'avviso in GCC per l'intero programma può essere ottenuto semplicemente non passando -pedantic al compilatore.

+0

Eventuali duplicati di [GCC bandiera di avvertimento compilatore per zero argomenti macro variadic] (http://stackoverflow.com/questions/35586426/gcc-compiler -warning-flag-for-zero-variadic-macro-arguments) – Zulan

+1

@Zulan la domanda chiede il nome del flag di avviso che abilita disabilita questo avviso. Questa domanda richiede come utilizzare esattamente tale avviso per disabilitare questo avviso in una definizione di macro all'interno di un file sorgente (la tua risposta si adatta meglio qui). – gnzlbg

+0

Vorrei suggerire di modificare la domanda originale per chiarire il tuo intento. – Zulan

risposta

2

Si dovrebbe essere in grado di sopprimere questo utilizzando

#pragma GCC system_header

Ma questo vale per il resto del file, e non solo è possibile utilizzarlo in file inclusi. Quindi non fornisce una scoping perfetta e potrebbe richiedere un rimpasto/inclusione indiretta dei file di intestazione.

(ma francamente, se non si può risolvere il file di intestazione per essere standard conformi, si potrebbe anche prendere in considerazione l'intera intestazione uno system_header, che esclude dal produrre la maggior parte degli avvisi.)

Vedi https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html

0

si può provare a usare questo:

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wvariadic-macros" 
#define FOO(A, ...) foo(A, ##__VA_ARGS__) 
#pragma GCC diagnostic pop 
+0

Hai collegamenti a qualsiasi risorsa relativa a questa funzionalità? – jake

+0

Forse questo: https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html –

Problemi correlati