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?
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.)
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:
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%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.
Tags und Links c c-preprocessor