mikrocontroller.net

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


Autor: Wolfgang Horn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kai Riek (kairiek)
Datum:

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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wolfgang Horn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Elektrikser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wolfgang Horn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.