Oui. Il est possible de définir une macro qui se développe en une directive pragma en utilisant l'opérateur unaire _Pragma
.
De 6.10.9 de la norme C99:
Un opérateur unaire de la forme: chaîne littérale )
est traitée comme suit: La chaîne littérale est destringized en supprimant le préfixe L
, le cas échéant, supprime les guillemets avant et arrière, remplace chaque séquence d'échappement \"
par un guillemet double et remplace chaque séquence d'échappement \\
par une seule barre oblique inverse. La séquence de caractères qui en résulte est traitée via la phase de traduction 3 pour produire des jetons de prétraitement qui sont exécutés comme s'ils étaient les pp-tokens dans une directive pragma. Les quatre jetons de prétraitement d'origine dans l'expression de l'opérateur unaire sont supprimés.
Un exemple de la norme est:
#define LISTING(x) PRAGMA(listing on #x)
#define PRAGMA(x) _Pragma(#x)
LISTING (..\listing.dir)
qui équivaut à:
#pragma listing on "..\listing.dir"
, c'est donc ce que vous cherchez:
#define PRAGMA(x) _Pragma(#x)
#define ISR(x) PRAGMA(isr=x)
Il y a un léger problème avec votre définition de 'ISR'. L'argument de '_Pragma' doit être un seul littéral de chaîne. –
Mon mauvais oui vous avez raison il doit être stringify avant de passer à _Pragma –