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.
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.)
Tags und Links macros c++ c-preprocessor expansion preprocessor-directive