Präprozessor-Makroexpansion in eine andere Präprozessor-Direktive

7

Anfangs dachte ich, ich brauche das, aber ich habe es schließlich vermieden. Aber meine Neugier (und mein Appetit auf Wissen, Brummen) lassen mich fragen:

Kann ein Präprozessor-Makro, zum Beispiel in

%Vor%

expand zu einem anderen Include, wie in

%Vor%

?

    
moala 11.08.2009, 18:12
quelle

3 Antworten

12

Ich glaube, das geht nicht, weil der Preprozessor single pass ist. Es kann also keine anderen Präprozessordirektiven ausgeben.

Insbesondere aus dem C99-Standard (6.10.3.4 Absatz 3):

  

3 Das Ergebnis ist komplett   Makro-ersetztes Vorverarbeitungstoken   Sequenz wird nicht als a verarbeitet   Preprocessing-Richtlinie, auch wenn es   ähnelt einem, ...

Interessanterweise wurde deshalb der unäre Operator _Pragma zu c99 hinzugefügt. Weil #pragma nicht durch Makros, sondern _Pragma kann.

    
Evan Teran 11.08.2009, 18:15
quelle
9

Der C-Standard sagt dies über Vorverarbeitungsrichtlinien (C99 - 6.10 (2) - Vorverarbeitungsrichtlinien):

  

Eine Preprocessing-Direktive besteht aus einer Sequenz von Vorverarbeitungstoken, die mit beginnt   ein # Preprocessing-Token, das (zu Beginn der Übersetzungsphase 4)   ...

und (C99 - 6.10 (7)):

  

Die Vorverarbeitungstoken in einer Preprocessing-Direktive unterliegen nicht dem Makro   Erweiterung, sofern nicht anders angegeben.

     

BEISPIEL In:

%Vor%      

Die Reihenfolge der Vorverarbeitungstoken in der zweiten Zeile ist keine Vorverarbeitungsdirektive, da sie nicht mit einem # zu Beginn der Übersetzungsphase 4 beginnt, obwohl dies nach dem Ersetzen des Makros EMPTY

Nein, Makros können nicht in eine ' #include ' Vorverarbeitungs-Direktive expandieren. Diese Richtlinien müssen zu Beginn der Übersetzungsphase 4 vorhanden sein (beim Umgang mit diesen Richtlinien findet eine Vorverarbeitung statt). Da Makroexpansion während Phase 4 auftritt, können Makros nicht zu Beginn von Phase 4 etwas verursachen.

Ich möchte jedoch darauf hinweisen, dass das folgende funktioniert :

%Vor%

weil der C-Standard dies sagt (C99, 6.10.2 (4) - Quelldateieinschluss):

  

Eine Richtlinie für die Vorverarbeitung des Formulars

%Vor%      

(das nicht mit einem der beiden vorherigen Formulare übereinstimmt) ist zulässig. Die Vorverarbeitung   Token nach include in der Direktive werden genauso verarbeitet wie im normalen Text. (Jeder   Bezeichner, der momentan als Makroname definiert ist, wird durch seine Ersetzungsliste ersetzt   Vorverarbeitungstoken.)

    
Michael Burr 11.08.2009 18:42
quelle
1

Alle Präprozessordirektiven werden interpretiert, bevor die Makroexpansion beginnt. Sie können also kein Makro in eine # include-Direktive erweitern und so interpretieren. Stattdessen wird es als (fehlerhafter) C ++ - Code interpretiert.

    
John Bode 11.08.2009 20:22
quelle