Token Pasting mit SDCC

OP #6270732
ich benutze schon seit vielen Jahren folgendes Makro auf verschiedenen c 
Compilern um eine Zeile in eine leere Anweisung + Kommentar zu 
expandieren.
1
  #define PRINTF ;/##/
2
aus
3
  PRINTF ("blablub"); 
4
wird dann 
5
  ;//("blablub");
Das funktioniert mit div Borland Compilern aber auch mit Keil c51. Das 
Konstrukt geht aber weder mit SDCC noch mit GCC (ARM).

Offensichtlich ist bei modernen Preprozessoren das anders gelöst. Wie 
macht man das richtig?

Ich suche nun nach einem alternativen Weg sowas zu implementieren.

Thomas
#6271025
Thomas Z. schrieb:
> Offensichtlich ist bei modernen Preprozessoren das anders gelöst.

Es ist eigentlich gar nicht Standard-konform.
Der Compiler arbeitet den Code in mehreren Phasen ab. In Phase 3 werden 
alle Kommentare durch jeweils ein Leerzeichen ersetzt. Erst danach, in 
Phase 4 werden dann die Präprozessor-Direktiven inklusive dem 
Token-Pasting-Operator bearbeitet.
OP #6273374
Rolf M. schrieb:
> Es ist eigentlich gar nicht Standard-konform.
> Der Compiler arbeitet den Code in mehreren Phasen ab. In Phase 3 werden
> alle Kommentare durch jeweils ein Leerzeichen ersetzt. Erst danach, in
> Phase 4 werden dann die Präprozessor-Direktiven inklusive dem
> Token-Pasting-Operator bearbeitet.

Dass irgendwas nicht standard konform ist ist mir inzwischen auch klar. 
Ich hab das bisher einfach angewendet ohne genauer darüber nachzudenken. 
Jetzt versuche einen Quellcode sowohl für Keil c51 als auch für SDCC 
umzubauen.
Deine Erklärung kann so nicht vollständig sein...
In Phase 3 gibt's ja noch keinen Kommentar der wird erst in Phase 4 
erzeugt. Ich muss mir mal die Präprozessor Ausgaben näher ansehen.

Jim M. schrieb:
> Siehe gcc doku: Variadic Macros.
Das PRINTF ist nur ein Beispiel. Es geht mir nicht um Variadic Makros. 
Trotzdem danke für den Hinweis.
#6273429
Thomas Z. schrieb:
> Dass irgendwas nicht standard konform ist ist mir inzwischen auch klar.
> Ich hab das bisher einfach angewendet ohne genauer darüber nachzudenken.

Was ich damit sagen wollte: Es hat sich eigentlich nichts geändert, 
sondern der bisherige Compiler war halt irgendwie anders umgesetzt, so 
dass es trotzdem funktioniert hat.

> Deine Erklärung kann so nicht vollständig sein...
> In Phase 3 gibt's ja noch keinen Kommentar der wird erst in Phase 4
> erzeugt.

Ja, eben. In Phase 3 werden eigentlich alle Kommentare entfernt, so dass 
es danach keine mehr gibt. Du versuchst dann aber, in Phase 4 wieder 
einen zu erzeugen. An der Stelle gibt es aber das Konzept von 
Kommentaren gar nicht mehr. Deshalb kann der Compiler damit nichts 
anfangen.
OP #6273486
Ich hab mir jetzt mal den Preprozessor Output angesehen. Da steht 
folgendes
1
   ;/ /("blablub");
Fehlermeldung ist:

error pasting"/" and "/" does not give a valid preprocessing token

Der Preprozessor fügt ein space ein. Es sieht so aus als wenn "/" 
ungültige Zeichen sind.
#6273645
Thomas Z. schrieb:
> Der Preprozessor fügt ein space ein. Es sieht so aus als wenn "/"
> ungültige Zeichen sind.

Nein, ein "/" nicht (sonst könnte man nicht dividieren), aber zwei am 
Stück schon, denn die hätten ja eigentlich schon eine Phase vorher alle 
entfernt worden sein müssen.

Thomas Z. schrieb:
> dort wird explizit die Verwendung als comment ausgeschlossen...

Ja, und die Erklärung dafür ist die selbe, die ich gegeben habe…

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.