Was bedeutet "##"?

Gast #365427
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
Gast #365428
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
Gast #365429
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.
#365430
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;
Gast #365432
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

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.