Frage

Ohne auf die blutigen Details ich ein #define Makro verwenden möchten, die auf eine #include erweitern, aber das Zeichen ‚#‘ ist verwirrend Preprocessor (wie es denkt, dass ich möchte ein Argument zitieren.)

Zum Beispiel möchte ich so etwas wie dies tun:

#define MACRO(name) #include "name##foo"

Und es verwendet, also:

MACRO(Test)

Welche wird erweitert zu:

#include "Testfoo"

Das bescheidene Zeichen # verursacht der Präprozessor barf. MinGW gibt mir die folgende Fehlermeldung:

'#' is not followed by a macro parameter

Ich glaube, ich muß das Zeichen # entkommen, aber ich weiß nicht, ob dies überhaupt möglich ist.

Ja, Makros sind in der Tat böse ...

War es hilfreich?

Lösung

Soweit ich erinnere Sie nicht eine andere Präprozessordirektive in definieren können.

Andere Tipps

Es ist möglich, eine Hash-Token in den vorverarbeiteten Token Strom einzufügen. Sie können es wie folgt:

#define MACRO(hash, name) hash include name
MACRO(#,"hello")

-expands an:

# include "hello"

Jedoch , regiert der Standard ausdrücklich für die Existenz der Vorverarbeitung Richtlinien eine weitere Analyse dieser Linie aus [cpp.rescan]:

  

Das resultierende vollständig Makro ersetzt Token-Sequenz Vorverarbeitung ist nicht als eine Vorverarbeitung Richtlinie verarbeitet, auch wenn es eine ähnelt.

Das Problem ist nicht wirklich ein Symbol # in der Ausgabe des Vorverarbeitungsbefehl bekommen.

Anscheinend wollen Sie die Präprozessor Ihre Datei zu Analysepunkten, mit neu geschaffenen # include-Direktiven als Teil der Makroerweiterung zu beschäftigen. Es ist nicht so. Wenn eine Zeile mit # beginnt, dann ist es eine Anweisung für den Preprozessor und interpretiert. Wenn eine Zeile nicht mit # beginnt, ist es nur unter Transformation einschließlich Makro-Substitution an den Vorprozessor. Dies ist ein einmal-per-Line-Test.

MACRO(Test)

startet nicht mit #. Daher ist es nicht als Präprozessordirektive interpretiert; stattdessen ist es unterliegt Makroersetzungsregeln.

Das ist, weil die # besondere Bedeutung hat, wenn sie in einem Makro verwendet.

#  means quote the following token (which should be a macro parameter name)
## means concatenate the preceding and following tokens.

In Ihrer Situation wird die # nicht von einem richtigen Token gefolgt. So in Ihrer Situation müssen wir durch eine Dereferenzierungsebene gehen:

#define     QUOTE(name)     #name
#define     TEST(name)      QUOTE(name ## foo)

#include TEST(scot)

Sie können das nicht tun. Präprozessordirektiven werden vor Makroerweiterung erkannt; wenn das Makro etwas expandiert in die wie eine Präprozessordirektive sieht, wird diese Richtlinie nicht erkannt. Das Beste, was Sie tun können, ist ein Makro für die Dateinamen erstellen:

#define MACRO(name) "name##foo"
...
#include MACRO(Test)

Das Macht Arbeit (es funktioniert für regelmäßigen #define Makros ohne Parameter, aber ich habe es nicht mit Makros mit Parametern getestet).

#define MACRO(name) <name##foo>
#include MACRO(Test)
#define HASH_SIGN #
BOOST_PP_CAT(HASH_SIGN, include)
#define PARAM_NAME Param
#define GETNAME_(a) #a
#define GETNAME(a) GETNAME_(a)

int Param;
printf("%s = %i\n", GETNAME(PARAM_NAME), PARAM_NAME);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top