#if oder #ifdef?

Gast #1621998
Lesenswert?

Ich nutze den GCC Compiller und Eclipse für den STM32.

Ich möchte gerne anhand einer Definition anders übersetzen. Ich hab 
folgendes geschrieben:
1
#define USED_UART  USART1
2

3
#if (USED_UART == USART1)
4
  #define POSTXE  U1_PosTxE
5
  #define POSTXA  U1_PosTxA
6
#endif
7
#if (USED_UART == USART2)
8
  #define POSTXE  U2_PosTxE
9
  #define POSTXA  U2_PosTxA
10
#endif

Beim Kompillieren kommt der Fehler:
error: operator '*' has no right operand
bei der #if Zeile.
USART1 ist in irgend welchen Dateien definiert als eine Speicheradresse 
auf die Pheriperie.

Weiß jemand Rat wie ich das Ändern kann?
Vielen Dank.
Gast #1622007
Lesenswert?

Für USART 1:
1
#define USED_USART1
2
#ifdef USED_USART1  
3
#define POSTXE  U1_PosTxE
4
  #define POSTXA  U1_PosTxA
5
#endif
Für USART 2:
1
#define USED_USART2
2
#ifdef USED_USART2  
3
#define POSTXE  U1_PosTxE
4
  #define POSTXA  U1_PosTxA
5
#endif
#1622018
Lesenswert?

Eventuell kannst du das dem Compiler überlassen, da USART1/2 
wahrscheinlich auf eine Konstante rausläuft und die Abfrage daher 
wegoptimiert wird:

#define POSTXE  ((USED_UART == USART1) ? U1_PosTxE : U2_PosTxE)
#define POSTXA  ((USED_UART == USART1) ? U1_PosTxA : U2_PosTxA)

Allerdings muss dann U2_PosTxE/USART2 in jedem Fall existieren. Sonst:

#ifdef USART2
 #define POSTXE  ((USED_UART == USART1) ? U1_PosTxE : U2_PosTxE)
 #define POSTXA  ((USED_UART == USART1) ? U1_PosTxA : U2_PosTxA)
#else
 #define POSTXE  U1_PosTxE
 #define POSTXA  U1_PosTxA
#endif
Gast #1622058
Lesenswert?

@AK
das geht leider nicht, denn ich schalte noch mehr Variablen um, also 
auch den UART Buffer mit einigen KB größe, also möchte ich nicht unnötig 
kostbaren Speicher reservieren.

Das Ziel sollte sein, dass ich die Dateien kopieren/umbenennen kann und 
ich nutze mit dem gelichen Code einen anderen UART, noch noch drin ein 
paar Defines ändern und es passt dann schon.

Mit dem ersten Tipp konnte ich das jetzt machen.
Moderator Persönliche Seite #1622217
Lesenswert?

Robert F. schrieb:
> Also ich vermute (!), dass er mit dem C-Vergleichsoperator ( a==b )
> nichts anfangen kann.

Doch, denn der liefert eine Ganzzahl (entweder 0 oder 1) als
Ergebnis.  Aber: auch der kann innerhalb des Präprozessors nur
Ganzzahlen vergleichen.  Von Dingen wie typecasts (die offenbar
im benutzten Makro vorhanden sind) hat er einfach keine Ahnung.

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