Wie wird ein Pfund / Hash über den C-Präprozessor gedruckt?

8

Ich brauche Hilfe bei der Durchführung folgender Dinge:

Eine Präprozessor-Makrobezeichnung (x) soll "#x" ausgeben, z. B.

%Vor%

Wenn ich label (aname) rufe, soll die Ausgabe "#aname" sein (ohne Anführungszeichen)

Ich weiß, dass die folgenden Versuche Fehler waren.

%Vor%

Es kann eine Art entkommene # (Pfund) geben, aber ich weiß nicht, wie ich entkommen kann ...

Bearbeiten : Ich starte "gcc -E test -o test.html", um die Ausgabe zu erhalten. Der Punkt ist: Wie drucke ich ein Hash-Zeichen (#) mit einem Makro nur mit den Fähigkeiten des Präprozessors?

    
tuergeist 06.09.2009, 20:10
quelle

5 Antworten

13

Die Antwort ist:

%Vor%

dann

%Vor%

erstellt

%Vor%

Ich habe es mit Hilfe von euch allen gefunden, besonders aber mit wintermute. Vielen Dank!

(mit gcc 4.3.3)

    
tuergeist 06.09.2009, 21:11
quelle
4

Ich glaube nicht, dass Sie das können, was nicht völlig unvernünftig ist, da die Ausgabe des C-Präprozessors kein nicht angekreuztes "#" erzeugen sollte, da dies auf eine Präprozessor-Direktive hinweist und Sie keine Präprozessor-Direktiven erzeugen können die Fliege so.

Mit anderen Worten, der C-Präprozessor ist ein Präprozessor für C (und C ++) und kein Allzweckwerkzeug.

Entweder verwenden Sie einen alternativen Makroprozessor ( m4 ist die Standardempfehlung für Unix-ähnliche Systeme) oder gehen Sie anders vor.

Zum Beispiel, haben Sie den Makroersatz:

%Vor%

Dann post-process die Ausgabe ersetzen "! @!" mit '#'.

(Das imake -Programm verwendet einen ähnlichen Stunt; der C-Präprozessor erledigt den größten Teil der Arbeit, aber seine Ausgabe behält keine Zeilenumbrüche bei, die für 'make' benötigt werden. Daher verwendet 'imake' die Notation '@@ \' oder um anzuzeigen, wo Zeilenumbrüche eingefügt werden müssen, nachdem der C-Präprozessor sein schlechtestes getan hat.)

    
Jonathan Leffler 06.09.2009 20:58
quelle
4

Sie können so etwas tun:

%Vor%

Ich habe das getestet, indem ich es direkt durch cpp (den C-Präprozessor) anstatt durch gcc ausgeführt habe. Beispiel:

%Vor%

Verwenden der cpp, die Teil der GCC-Version 4.0.1 ist.

Das einzige Problem, das mir aufgefallen ist, ist, dass ich eine extra unerwünschte Ausgabe bekomme, nämlich die ersten 4 Zeilen der Datei sind wie folgt:

%Vor%     
E.M. 06.09.2009 20:59
quelle
3

String-Literale in C werden verkettet, also können Sie

machen %Vor%

Ich denke nicht, dass es ohne String-Verkettung möglich ist (dh ohne den C-Compiler wie gewünscht aufzurufen):

Sie können einige ausgefallene Dinge mit zusätzlichen Ebenen der Indirektion ausführen und ich habe sogar den Präprozessor dazu gebracht, die gewünschte Ausgabe über

zu erzeugen %Vor%

Das Problem ist, dass es auch eine Fehlermeldung generiert, wenn in_between() auf #foo expandiert, was kein gültiges Präprozessor-Token ist. Ich sehe das nicht anders.

Ich würde empfehlen, das richtige Werkzeug für den Job zu wählen: Wechseln Sie zu einer anderen Makrosprache wie m4 oder sogar ML / I, wenn Sie abenteuerlustig sind oder eine Skriptsprache wie PHP oder Perl verwenden. GPP scheint ebenfalls gut zu sein und könnte besser passen.

    
Christoph 06.09.2009 20:14
quelle
1

Versuchen:

%Vor%     
Neil 06.09.2009 20:13
quelle

Tags und Links