Chriss wrote:
> Wie könnte man das ganze dann umschreiben das es so funktioniert?
>
> Hab mir diesen stil aus nem sourcecode abgeschaut.
> finde ich deshalb cool weil es die übersichtlichkeit erhöht.
>
> Was ich da genau mache ist mir nicht unbedingt klar. vl kann mir das
> jemand noch genau erklären.
>
>
> #define start_timer() TCCR1B |= (1<<CS10);
>
> so kann ich diesen aufruf dann mit
> start_timer(); ausführen...
Ja.
Nimm aber den ; hier weg
#define start_timer() TCCR1B |= (1<<CS10);
^
>
>
> geht das ganze auch ohne der klammer? so:
> #define start_timer TCCR1B |= (1<<CS10);
> und dann ausführung mit:
>
> start_timer;
Sicher.
Der Präprozessor macht nur Textersetzungen. Dort wo
jetzt
start_timer;
steht, ersetzt er den Text "start_timer" mit dem Text, den
du im #define angegeben hast. Da entseht dann
TCCR1B |= (1<<CS10);;
da draus (Und jetzt siehst du auch, warum du im Makro den ;
weglassen solltest)
Du könntest zb Folgendes machen
#define PRESCALER_1 ( 1 << CS10 )
#define PRESCALER_8 ( 1 << CS11 )
#define PRESCALER_64 ( 1 << CS11 ) | ( 1 << CS10 )
#define PRESCALER_256 ( 1 << CS12 )
#define start_timer(x) TCCR1B |= (x)
und benutzt das dann in der Form
start_timer( PRESCALER_64 );
Wenn du selbst wieder mal Präprozessor spielst:
start_timer durch den im Makro angegebenen Text ersetzen. Das
Makroargument x wird dabei zu PRESCALER_64. Also liefert die
Ersetzung:
TCCR1B |= (PRESCALER_64);
Nun ist aber PRESCALER_64 seinerseits wieder ein Makro. Dessen
Ersetzung liefert den Text "( 1 << CS11 ) | ( 1 << CS10 )".
Den anstelle von PRESCALER_64 eingesetzt, liefert dann
TCCR1B |= (( 1 << CS11 ) | ( 1 << CS10 ));
genau das, was du haben willst.