Forum: Compiler & IDEs Bedingter Compile bei GCC


von Gary (Gast)


Lesenswert?

Hallo -
ich habe ein Parametrier-Funktion die eine ganze Latte von
Parametern hat und in deren Abhängigkeit Register unterschiedlich
belegt.
Um den Code zu verkleinern würde ich diese Parameter gerne als
#define im Header einbauen und abhängig von deren WERTEN bestimmte
Zeilen compilieren oder nicht...
Beispiel:
#define Parameter1 AFFE
Code:
#if Parameter1 == AFFE
  ......
#endif
Nun meine Frage - geht sowas beim GCC?
Die Abfrage nimmt er zwar an - aber anscheinend compiliert er einfach
alle Zeilen die mit den #if's eingeschlossen sind unabhängig von den
Werten.
Vielen Dank für eure Antworten,
Gary

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


Lesenswert?

Der C-Präprozessor rechnet mit Integerzahlen (im Format des
Targets, also 16-bit-Integers beim AVR-GCC, falls kein Suffix
angegeben ist).  Damit geht

#if Parameter1 == AFFE

nicht, aber

#if Parameter1 == 0xAFFE

von Gary (Gast)


Lesenswert?

Hallo Jörg,

vielen Dank ... kleines Missverständniss :o)

AFFE war hier einfach als String gedacht, d.h konkret habe ich

#define Parameter1 TRUE
#define Parameter2 5

#if Parameter1 == TRUE
aber auch Zahlenwerte
#if Parameter2 == 5

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


Lesenswert?

TRUE ist keine Zahl (sofern nicht ein #define TRUE 1 voranging).
Strings kannst du nicht vergleichen, ich schrob doch, dass nach
dem #if ein integer-Ausdruck erwartet wird.

#if Parameter1 == TRUE

ist eine unsinnige Formulierung.  Schreib bitte einfach

#if Parameter1

Es gilt die übliche C-Notation: wenn Parameter1 0 ist, ist der
Ausdruck false, sonst true.  (Wenn Parameter1 nicht definiert
ist, wird es für diesen Zweck wie 0 behandelt, mit der Ausnahme,
dass es bei -Wundef eine Warnung gibt.)

von Michael J. (jogibaer)


Lesenswert?

Hallo,

ich habe ein ähnliches Problem.

Ich habe so eine Art Systemtimerfunktion, wo ich benötigte Zeiten per
Timer erzeuge und dem Programm zu Verfügung stelle.

Je nach Prozessor ( Mega 8 , 32, 128 ) habe ich etwas unterschiedliche
Timer bzw. Register.

Ich möchte das z.B. so erledigen:

#if ATMEGA8

Registersowieso = Parameter sowieso
u.s.w.

#endif

#if ATMEGA32

Registersowieso = Parameter sowieso
u.s.w.

#endif


#if ATMEGA128

Registersowieso = Parameter sowieso
u.s.w.

#endif

Ich müßte vorher dann nur schreiben
#define ATMEGA32 = 1


Funktioniert das so, oder muß ich dies andersmachen ?
Wie kann man sowas am besten lösen ?
Ich denke mal, der Sinn müßte klar sein.


Jogibär

von Karl H. (kbuchegg)


Lesenswert?

Ausprobieren.

Ich würde es so machen


#ifdef ATMEGA8
#define TIMER_REG  TCCR1B
#define TIMER_VAL  ( 1 << CS12 ) | ( 1 << CS10 )
#endif

#ifdef ATMEGA32
#define TIMER_REG  TCCR0
#define TIMER_VAL  ( 1 << CS02 ) | ( 1 << CS00 )
#endif

#ifdef ATMEGA128
#define TIMER_REG  TCCR2
#define TIMER_VAL  ( 1 << CS12 ) | ( 1 << CS00 )
#endif

int main()
{
   TIMER_REG = TIMER_VAL;


je nachdem, ob jetzt vorher mal ein
#define ATMEG8
gegeben wurde, oder ein
#define ATMEGA32
oder
#define ATMEGA128

wird die Textersetzung von

  TIMER_REG = TIMER_VAL

anders gemacht.

Ich würde übrigens nicht meine eigenen Konstanten (ATMEGA8
usw. dafür verwenden, sondern die, die dier Compiler auch
dafür benutzt.
Schau einfach mal in io.h rein. Dort wird je nach Prozessor
ein spezifisches ioxxx.h inkludiert. Die Technik von
dort kannst du wunderbar übernehmen.

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.