#if oder #ifdef?

Gast #1621998
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
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
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
@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
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.