Forum: Compiler & IDEs #if oder #ifdef?


von Plan (Gast)


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.

von Heinz Heizer (Gast)


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

von Plan (Gast)


Lesenswert?

Ja, stimmt, ich drehe das einfach um und mache dann in die #if den 
"#define USED_UART  USART1" rein.

Danke für die Idee.

von Robert F. (fastred)


Lesenswert?

hi,

der Präprozessor kann in der if-Direktive nur "test the value of an 
arithmetic expression, rather than the mere existence of one macro."

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

vgl
http://gcc.gnu.org/onlinedocs/gcc-3.0.1/cpp_4.html#SEC38

von (prx) A. K. (prx)


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

von Plan (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Robert F. (fastred)


Lesenswert?

ah kk, thx!

Naja für mich bleibt da trotzdem ein komischer Beigeschmack, den 
Präprozessor für "solche" Dinge zu verwenden. Gibt bestimmt auch 
Situationen wo man da nicht durmherum kommt ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.