2010-11-26 62 views
1

J'ai des problèmes avec cette tentative de macro:#define ISR (x) = x #pragma isr

#define ISR(x) #pragma isr=x 

ne compile pas parce qu'il essaie de remplacer #pragma avec un paramètre inexistant. Y a-t-il un moyen de réaliser ce que j'essaie de faire? Je voudrais obtenir ISR(VEC1) élargi comme #pragma isr=VEC1.

Répondre

5

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) 
3

Cette ne fonctionnera pas comme dans le code

#define ISR(x) #pragma isr=x 

Le "#" dans une définition de macro est un opérateur de Stringification. C'est-à-dire que si # est précédé d'un argument, il va le stringifier sinon l'opérateur # sera ignoré. Donc, en résumé pour répondre à votre question, vous ne pouvez pas le faire.

Si votre compilateur implémente C99 vous pouvez utiliser _Pragma au lieu comme celui-ci

#define ISR(X) _Pragma(isr=x) 

Plus référence _Pragma here

+0

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. –

+0

Mon mauvais oui vous avez raison il doit être stringify avant de passer à _Pragma –