Hi, Freunde, aus sfr_defs.h: #define _VECTOR(N) _vector ## N Habe ich meinen Kernighan/Ritchie lückenhaft gelesen? Und ebenso meinen Stroustrup? Habe ich bei der avr-lib nicht richtig gesucht? Was bedeutet und bewirkt "##"? Ciao Wolfgang Horn
Vielleicht Platzhalter? _VECTOR(5) wird dann zu _vector 5 oder so. Was sagt das Compilerhadbuch dazu?
Mit ## werden die beiden Werte zu einem zusammengefügt Es wird also z.B. vector5 daraus. Irgendwo steht das im Kernighan/Ritchie, aber nicht ausführlich, da man sowas selten benötigt.
Hi, Benedikt, "it ## werden die beiden Werte zu einem zusammengefügt" Mein Kernighan/Ritchie sieht so alt aus wie er ist, 1983, und da ist der Ausdruck "##" auch im Präprozessor-Kapitel nicht aufgeführt. Die Vermutung liegt nahe, daß vector zur Startadresse der Interrupt-Vektortabelle im Flash wird und der Präprozessor den Wert N zu dieser Startadresse addiert. Wenn dem so ist, dann kreisen meine Gedanken schon phantasievoll, was man damit noch alles anfangen könnte. Ist "Zuweisung einer Variablen an eine konstante Adresse im Flash", wie sie ja offenbar passiert, nicht ein häufiger Wunsch? Müßte nicht auch eine Zuweisung von PORTA, DDRA und PINA damit elegant möglich sein? Ich weiß es nicht - dazu möchte ich verstehen, wie "##" funktioniert. Ah, spannend, ich erinnere mich an die Schatzsucherzeiten meiner kindheit... Ciao Wolfgang Horn
Hier mal ein Auszug aus dem K&R (2.Ausgabe) S.88: "Mit dem Preprozessor-Operator ## kann man Argumente während der Makro-Expansion aneinanderhängen. Steht ein Parameter im Ersatztext neben ##,wird der Parameter durch das Argument ersetzt, ## und der umgebene Zwischenraum werden entfernt, und das Ergebnis wird nöchmals (auf Makroaufrufe) untersucht. Zum Beispiel verkettet der Makro paste seine beiden Argumente: #define paste (front, back) front ## back paste(name,1) erzeugt das Symbol name1. Die Regeln für verschachtelte ## sind mysteriös; die Details kann man in Anhang A finden." Anhang A, S.228: "Zweitens, wenn die token-sequence jeder der beiden Formen einer Makrodefinition das Symbol ## enthält, wird unmittelbar nach Ersatz der Parameter jedes ## gelöscht, und zwar zusammen mit Zwischenraum auf beiden Seiten, so dass die benachbarten Symbole verkettet werden und ein neues Symbol bilden. Der Effekt ist undefiniert, wenn ungültige Symbole produziert werden oder wenn Resultat von der Reihenfolge der Bearbeitung mehrerer ## abhängt. ## darf ausserdem weder am Anfang noch am Ende der Ersatz-Symbolfolge auftreten." Das war es erst einmal. Es sind noch zwei Beispiele aufgeführt, aber im Groben dürfte es klar sein. Gruß Elektrikser
An sich funktioniert das ganze, aber nur solange, bis man dem #define keinen Wert, sondern ein anderes define übergibt: z.B. wenn man folgendes macht: #define sbi(sfr, bit) sfr ## _ ## bit ## =1 sbi (PORTA, 5); wird damit zu PORTA_5=1; Das funktioniert also wunderbar. Möchte man aber folgendes machen: #define PORT PORTA wird das hier: sbi (PORT, 5); zu dem hier: PORT_5=1; Das ist also nicht das gewünschte. Wie man das hinbekommt, so dass es funktioniert, habe ich noch nicht herausgefunden.
> Wie man das hinbekommt, so dass es funktioniert, habe ich > noch nicht herausgefunden. Dein Beispiel funktioniert, wenn man eine weitere Indirektion einführt: #define real_sbi(sfr, bit) sfr ## _ ## bit = 1 #define sbi(sfr, bit) real_sbi(sfr, bit) #define PORT PORTA // Nun wird: sbi(PORT, 5); // zu: PORTA_5 = 1;
Das kam erst mit ANSI-C, kann dein Steinzeit-K&R also nicht wissen. Davor verwendete man a/**/b was in K&R-C auf "ab", in ANSI-C aber zu "a b" wird.
Hi, Freunde, Danke. Erstens für die sachliche Information. Zweitens für die Erleichterung meines Herzens auf "Das kam erst mit ANSI-C, kann dein Steinzeit-K&R also nicht wissen." Ciao Wolfgang Horn
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.