2012-01-04 9 views
6

Voglio avere una macro che è invocato in questo modo:Come si implementa una macro che crea una stringa tra virgolette per _Pragma?

GCC_WARNING(-Wuninitialized) 

che si espande a codice come questo:

_Pragma("GCC diagnostic ignored \"-Wuninitialized\"") 

non sto avendo fortuna ottenere questo al lavoro, come i soliti trucchi i join e le stringificazioni del preprocessore non sembrano applicabili o non so come applicarli qui.

+0

Questo è stato un errore di battitura, giusto? –

risposta

0

Sarebbe anche accettabile se l'argomento macro è racchiuso tra virgolette singole? Se è così, si potrebbe usare questo:

#define GCC_WARNING(x) _Pragma("GCC diagnostic ignored '" #x "'") 

Quando definendolo come GCC_WARNING(-Wuninitialized) si espande per

_Pragma("GCC diagnostic ignored '" "-Wuninitialized" "'") 

ho dovuto fare uso della stringa concatenazione comportamento di C (printf("a" "b"); è lo stesso di printf("ab");) qui poiché l'utilizzo di "'#x'" in una macro eviterebbe che x sia espanso.

+0

Quasi ... in realtà "_Pragma" ha un significato speciale per gcc. Stavo postando una soluzione simile, ma mi sono reso conto che non funziona con il mio gcc perché il preprocessore si lamenta ("errore: _Pragma prende una stringa letterale tra parentesi"). –

+1

Che non funzionerà - '_Pragma' interpreta il suo argomento prima che le stringhe siano concatenate, quindi vedrà due stringhe, non una. A differenza di 'printf', è un costrutto speciale che segue regole speciali. – Lindydancer

+0

Ah, che sciocco, non mi è venuto in mente che questa era una domanda specifica del GCC. Pensavo che '_Pragma' fosse una funzione di debug personalizzata, ma ora che guardo il nome della macro, avrei dovuto saperlo meglio. –

14

Con il piccolo aiuto della magia preprocessore:

#define HELPER0(x) #x 
#define HELPER1(x) HELPER0(GCC diagnostic ignored x) 
#define HELPER2(y) HELPER1(#y) 
#define GCC_WARNING(x) _Pragma(HELPER2(x)) 

GCC_WARNING(-Wuninitialized) 
+0

Grazie, ma questo non funziona, probabilmente a causa del fatto che non mette \ "intorno -Wininitialized.L'utilizzo di macro sopra restituisce il seguente errore GCC: ignorando #pragma diagnostica GCC [-Progressi noti] – ThreeBit

+0

Inserisce virgolette intorno a -Wininitialized.Il problema è stato un errore 'diagnostics' invece di' diagnostic' - L'ho risolto nella risposta sopra. – Lindydancer

+1

mi hai salvato la vita – MoLice

Problemi correlati