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
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
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
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.)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.