mikrocontroller.net

Forum: Compiler & IDEs #if oder #ifdef?


Autor: Plan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#define USED_UART  USART1

#if (USED_UART == USART1)
  #define POSTXE  U1_PosTxE
  #define POSTXA  U1_PosTxA
#endif
#if (USED_UART == USART2)
  #define POSTXE  U2_PosTxE
  #define POSTXA  U2_PosTxA
#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.

Autor: Heinz Heizer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für USART 1:
#define USED_USART1
#ifdef USED_USART1  
#define POSTXE  U1_PosTxE
  #define POSTXA  U1_PosTxA
#endif
Für USART 2:
#define USED_USART2
#ifdef USED_USART2  
#define POSTXE  U1_PosTxE
  #define POSTXA  U1_PosTxA
#endif

Autor: Plan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Robert F. (fastred)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Plan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Robert F. (fastred)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.