nested #if makro

Gast #5925158
Lesenswert?

wie macht man sowas hier richtig?
1
#define LED_SET_ON(PRT,PIN,INV)\
2
  #if(INV == 0)\
3
    PORT##PRT |= (1<<PIN)\
4
  #else\
5
    PORT##PRT &=~(1<<PIN)
6

7
#define LED_SET_OFF(PRT,PIN,INV)\
8
  #if(INV == 1)\
9
    PORT##PRT |= (1<<PIN)\
10
  #else\
11
    PORT##PRT &=~(1<<PIN)

Im code bzw. in weiteren makros will ich es so nutzen:
1
LED_SET_ON(D,5,1);  // PD5 low  -> LED an
2
LED_SET_ON(D,6,0);  // PD6 high -> LED an
3
(...)
4
LED_SET_OFF(D,5,1); // PD5 high -> LED aus
5
LED_SET_OFF(D,6,0); // PD6 low  -> LED aus

Die LED-Markos sind noch falsch definiert, sodass der Compiler einen 
Fehler wirft:
1
myfile.c:203:31: error: '#' is not followed by a macro parameter
daher werden die Markos auch im code als Funktionen mit Parametern 
interpretiert:
1
LED_SET_OFF(D,5,1)
1
myfile.c:223:16: error: 'D' undeclared (first use in this function)
#5926711
Lesenswert?

1
#define DEFINE_LED(NAME,PRT,PIN,INV)   \
2
  inline void Led_##NAME_Off() {       \
3
    if(INV) PORT##PRT |= (1<<##PIN);   \
4
    else    PORT##PRT &= (1<<##PIN); } \
5
  inline void Led_##NAME_On()  {       \
6
    if(INV) PORT##PRT &= (1<<##PIN);   \
7
    else    PORT##PRT |= (1<<##PIN); }
8

9
DEFINE_LED(Warning,D,5,true)
10
DEFINE_LED(Power,  D,6,false)
11

12
...
13
Led_Warning_Off();
14
Led_Power_On();
Und dann hoffen, dass der Compiler alles schön inline-t ;-)

Hat wenigstens den Vorteil dass
* ich mich nur an einer Stelle drum kümmern muss ob eine LED mit 
Negativ-Logik angesprochen werden soll
* ich mich nicht Port und Pin merken muss im Code, sondern eine 
sinnvolle Name benutzen kann,
* und nicht definierte LEDs zur Compile-time schon gefunden werden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren