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>;

?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top