2017-09-01 4 views
2

Voici doesn't compile:avertissement paramétrés réduire au silence des problèmes macro

#define SUPPRESS(w) _Pragma("GCC diagnostic ignored " ## w) 

SUPPRESS("-Wuseless-cast") 

int main() { 
    int a = (int)4; 
    return a; 
} 

Voici l'erreur:

error: pasting ""GCC diagnostic ignored "" and ""-Wuseless-cast"" does not give a valid preprocessing token 

Comment puis-je obtenir pour travailler?

+0

En fonction de la [phase de traduction] (http://en.cppreference.com/w/cpp/language/translation_phases) la directive '_Pragma' est gérée, vous pouvez peut-être vous fier à la chaîne littérale consécutive standard enchaînement. Cela signifie que si vous avez deux constantes de chaîne littérales avec seulement des espaces (ou des commentaires) entre elles, elles seront automatiquement concaténées en une seule chaîne. Si c'est le cas, vous n'avez pas besoin de l'opérateur de concaténation du préprocesseur. Vous pourriez vouloir essayer cela. –

+0

@Someprogrammerdude comme '' '_Pragma (" diagnostic GCC ignoré "w)' '' '? ne fonctionne pas. Aussi, vous pouvez expérimenter avec le lien du compilateur en ligne que j'ai fourni. – onqtam

Répondre

3

La chose est que _Pragma veut avoir une chaîne littérale comme si

_Pragma("GCC diagnostic ignored \"-Wuseless-cast\"") 

échappé Donc, l'astuce est d'ajouter une autre couche de stringyfication entre l'appel de SUPPRESS et l'appel de _Pragma comme ci-dessous

#define xSUPPRESS(w) _Pragma(#w) 
#define SUPPRESS(w) xSUPPRESS(GCC diagnostic ignored w) 

SUPPRESS("-Wuseless-cast") 

Voir here en action.