Forum: Compiler & IDEs Was bedeutet "##"?


von Wolfgang Horn (Gast)


Lesenswert?

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

von Kai R. (kairiek)


Lesenswert?

Vielleicht Platzhalter? _VECTOR(5) wird dann zu _vector 5 oder so. Was
sagt das Compilerhadbuch dazu?

von Benedikt (Gast)


Lesenswert?

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.

von Wolfgang Horn (Gast)


Lesenswert?

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

von Elektrikser (Gast)


Lesenswert?

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

von Benedikt (Gast)


Lesenswert?

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.

von Christoph _. (chris)


Lesenswert?

> 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;

von A.K. (Gast)


Lesenswert?

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.

von Wolfgang Horn (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.