Präprozessormakro Erweiterung auf eine andere Präprozessordirektive
-
12-09-2019 - |
Frage
Am Anfang dachte ich, ich dies erforderlich ist, aber ich es schließlich vermieden. Aber meine Neugier (und Appetit auf Wissen, hum) machen mich fragen:
Kann ein Präprozessormakro, zum Beispiel in
#include "MyClass.h"
INSTANTIATE_FOO_TEMPLATE_CLASS(MyClass)
zum anderen erweitern umfassen, wie in
#include "MyClass.h"
#include "FooTemplate.h"
template class FooTemplate<MyClass>;
?
Lösung
Ich glaube, dass nicht getan werden kann, ist dies, weil der Pre-Prozessor ist Single-Pass . So kann es nicht andere Präprozessordirektiven emittieren.
Insbesondere aus dem C99 Standard (6.10.3.4 Absatz 3):
3 Die resultierenden vollständig Makro ersetzt Vorverarbeitung Token Sequenz nicht als verarbeitetes Präprozessordirektive auch wenn es ähnelt einer ...
Interessanterweise Aus diesem Grund ist der einstellige _Pragma
Betreiber c99 hinzugefügt wurde. Da #pragma
nicht emited von Makros werden könnte, aber _Pragma
kann.
Andere Tipps
Der C-Standard sagt über Vorverarbeitung Richtlinien (C99 - 6.10 (2) - Präprozessor-Direktiven):
Eine Vorverarbeitung Richtlinie besteht aus einer Folge von Vorverarbeitung Token, die mit beginnt a # Vorverarbeitung Token dass (zu Beginn der Übersetzungsphase 4) ...
und (C99 - 6,10 (7)):
Die Vorverarbeitung Token innerhalb einer Vorverarbeitung Richtlinie unterliegen nicht der Makro Expansion sofern nicht anders angegeben.
Beispiel in:
#define EMPTY EMPTY # include <file.h>
die Sequenz Zeichen der Vorverarbeitung in der zweiten Zeile ist keine Vorverarbeitung Richtlinie, weil es nicht mit einem # zu Beginn der Übersetzungsphase 4, auch beginnt, obwohl es dies tun wird, nachdem das Makro LEER ersetzt worden
Also, nein, Makros kann nicht in eine ‚#include
‘ Präprozessordirektive erweitern. Diese Richtlinien statt zu Beginn der Übersetzungsphase sein müssen 4 (wenn diese Richtlinien Handhabung erfolgt Vorverarbeitung geschieht). Da Makroerweiterung während der Phase 4 auftritt, Makros kann nicht etwas bewirken zu Beginn der Phase existieren 4.
Ich möchte jedoch darauf hinweisen, dass die folgende funktioniert Arbeit:
#ifdef WIN32
#define PLATFORM_HEADER "platform/windows/platform.h"
#else
#define PLATFORM_HEADER "platform/linux/platform.h"
#include PLATFORM_HEADER
, weil der C-Standard sagt dies (C99, 6.10.2 (4) - Die Quelldatei Aufnahme):
Eine Vorverarbeitung Richtlinie von der Form
# include pp-tokens new-line
(das nicht ein übereinstimmt der beiden vorangegangenen Formen) ist zulässig. die Vorverarbeitung Tokens, nachdem sie in der Richtlinie enthalten ist, ebenso wie in normalen Text verarbeitet. (Jeder Kennung derzeit als Makronamen definiert ist durch seine Ersetzung Liste ersetzt von Vorverarbeitung Token.)
Alle Präprozessordirektiven interpretiert werden, bevor Makro Expansion beginnt, also nein, Sie kein Makro erweitern in eine # include-Direktive haben können und haben es als solche interpretiert werden. Stattdessen werden sie als (fehlerhafte) C ++ Code interpretiert.