C - Bedingte Kompilierung

OP #5520907
Lesenswert?
• ▲
▼
Moin,

ist es möglich sich die Berechnung auswerfen zu lassen?
1
#define TIMER_PRESCALER      1024  
2
#define TIMER_MS        50
3

4
#if    TIMER_PRESCALER == 1
5
  #undef TIMER_PRESCALER_gc
6
  #define TIMER_PRESCALER_gc  TC_CLKSEL_DIV1_gc
7
#elif  TIMER_PRESCALER == 2
8
  #undef TIMER_PRESCALER_gc
9
  #define TIMER_PRESCALER_gc  TC_CLKSEL_DIV2_gc
10
#elif  TIMER_PRESCALER == 4
11
  #undef TIMER_PRESCALER_gc
12
  #define TIMER_PRESCALER_gc  TC_CLKSEL_DIV4_gc
13
#elif  TIMER_PRESCALER == 8
14
  #undef TIMER_PRESCALER_gc
15
  #define TIMER_PRESCALER_gc  TC_CLKSEL_DIV8_gc
16
#elif  TIMER_PRESCALER == 64
17
  #undef TIMER_PRESCALER_gc
18
  #define TIMER_PRESCALER_gc  TC_CLKSEL_DIV64_gc
19
#elif  TIMER_PRESCALER == 256
20
  #undef TIMER_PRESCALER_gc
21
  #define TIMER_PRESCALER_gc  TC_CLKSEL_DIV256_gc
22
#elif  TIMER_PRESCALER == 1024
23
  #undef TIMER_PRESCALER_gc
24
  #define TIMER_PRESCALER_gc  TC_CLKSEL_DIV1024_gc
25
#endif 
26

27
#define TIMER_CALC        ((uint16_t( ( ( ( uint32_t )( F_CPU / TIMER_PRESCALER ) ) / 1000 ) * TIMER_MS ))
28

29
#if TIMER_CALC > 0xFFFF
30
  #error  "BLUBB"
31
#endif
Gast #5521021
Lesenswert?
• ▲
▼
Die Ausgabe des Ergebnisses geht nicht. Der Schlüssel dazu ist die 
Unterscheidung zwischen Präprozessor und Compiler.

Der Präprozessor ersetzt TIMER_CALC wortwörtlich durch das, was dahinter 
steht, und rechnet nicht etwa das aus. Erst der Compiler analysiert 
überhaupt erst den Ausdruck, und es steht ihm frei, schon bei der 
Kompilierung des Ausdruck zu berechnen (sofern ...), oder aber ihn erst 
zur Laufzeit ausrechnen zu lassen.

Wenn der Ausdruck in einem #if verwendet wird, kann zwar auch der 
Präprozessor ihn auswerten, allerdings mit großen Einschränkungen. Aber 
Ausgeben wie beim printf oder so sind nicht möglich. Dsgl. bei 
static_assert.

PS Das #if TIMER_PRESCALER == 1 ... #endif geht kürzer mit:

#define _TIMER_PRESCALER_gc(pre) TC_CLKSEL_DIV ## pre ## _gc
#define TIMER_PRESCALER_gc(pre) _TIMER_PRESCALER_gc(pre)

und danach etwas wie

int val = TIMER_PRESCALER_gc(TIMER_PRESCALER);

Einfach mal den Präprozessor-Output ansehen (bei gcc mit '-E').
#5521458
Lesenswert?
• ▲
▼
Hallo Jan,

Du möchtest eine Compiler Directive nutzen, um während der "Compilation" 
ein Rechenwert auszudrucken?

Gibt es ein Handbuch zum Compiler? Was sagt das Stichwort "Directive" 
dazu?
Falls Du es nicht gleich findest, versuche einmal Dir aktuelle Uhrzeit 
oder das Datum während der Compilation auszudrucken. Mit 
Rechenergebnissen geht das genauso.

Oder Du guckst in das Listing.

Allerdings rechnen die Compiler nicht immer so viel aus, wie später das 
Target.

Oder habe ich etwas falsch verstanden?

Happy coding!

Bernd

Antwort schreiben

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.

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.