2016-06-12 3 views
0

J'utilise le compilateur XC8 pour développer une petite application embarquée avec un PIC. Dans XC8 pour définir l'utilisation d'une broche (sortie ou entrée), le programmeur doit exécuter une instruction de ce type:Comment évaluer la virgule dans un #define

TRISAbits.RA0 = 1; 

en particulier:

  • TRIS dans le préfixe de registre (constant)
  • A est le port
  • bits est le suffixe (constant)
  • RA0 est le nom de la broche

Ce que je veux faire est de définir toutes les broches avec un nom lisible par l'homme, comme:

#define LED_1  A,RA0 
#define LED_2  A,RA1 
#define SWITCH_1 B,RB5 
... 

Et définir des macros comme SET_OUTPUT ou SET_INPUT utilisés de cette façon: SET_OUTPUT(LED_1).

Ce que j'ai essayé de faire est de ces deux macros:

#define SET_INPUT(port, pin) TRIS ## port ## bits. ## pin ## = 0 

cependant, la virgule à l'intérieur des constantes définies précédemment n'est pas développé et interprété comme un seul argument. J'ai également essayé:

#define SET_INPUT(X) SET_INPUT_(X ## "") 
#define SET_INPUT_(port, pin) TRIS ## port ## bits. ## pin ## = 0 

sans succès.

est essentiellement le contraire de cette question: Comma in C/C++ macro

Existe t-il une solution ou d'une façon plus commode de le faire?

+0

Au début, vous dites qu'il devrait être '= 1', mais vous avez essayé' = 0' dans vos macros, ce qui est à ce sujet? –

Répondre

2

Vous étiez près:

#define SET_INPUT(X) SET_INPUT_(X) 
#define SET_INPUT_(port, pin) TRIS ## port ## bits.pin = 1 

Le ## est seulement pour coller deux jetons pour former un autre jeton. Pour les cas où vous ne formez pas un nouveau jeton (par exemple bits.pin), vous n'avez rien à faire de spécial.

Je recommande statement-izing the macro:

#define SET_INPUT_(port, pin) do { TRIS ## port ## bits.pin = 1; } while (0)