Wie konvertiert man verkettete Strings mit dem C-Präprozessor in Wide-Char?

Ich arbeite an einem Projekt, in dem ich viele konstante Zeichenfolgen habe, die durch Verkettung (Zahlen usw.) gebildet werden.

Zum Beispiel habe ich eineLOCATION Makro, das formatiert__FILE__ und__LINE__ in eine Zeichenfolge, mit der ich beim Drucken von Nachrichten oder Fehlern feststellen kann, wo ich mich im Code befinde:

#define _STR(x)    # x
#define STR(x)     _STR(x)
#define LOCATION __FILE__ "(" STR(__LINE__) ")"

Dies würde also einen Speicherort wie "file.cpp (42)" formatieren. Das Problem ist, wenn ich versuche, das Ergebnis in eine breite Zeichenfolge umzuwandeln:

#define _WIDEN(x)  L ## x
#define WIDEN(x)   _WIDEN(x)
#define WLOCATION  WIDEN(LOCATION)

Dies funktioniert gut mit GCC und führt dazu, dass L "file.cpp (42)" in meinen Code eingefügt wird. Wenn ich dies jedoch mit MSVC ++ (unter Verwendung von Visual C ++ 2008 Express) versuche, erhalte ich eine Fehlermeldung:

error: Concatenating wide "file.cpp" with narrow "("

Ich verstehe, dass dieL Das Präfix wird nur dem ersten Term in meinem Ausdruck hinzugefügt. Ich habe es auch versucht:

#define _WIDEN(x) L ## #x

Welches "funktioniert", gibt aber die ZeichenfolgeL"\"file.cpp\" \"(\" \"42\" \")\"" Das ist offensichtlich nicht sehr praktisch (und nicht das, wonach ich suche), vor allem, wenn man bedenkt, dass dieses Makro im Vergleich zu anderen Makros einfach ist.

Meine Frage lautet also: Wie kann ich es auf den gesamten Ausdruck in MSVC ++ anwenden, damit ich das gleiche Ergebnis wie mit GCC erhalte? Ich würde lieber keine zweite Zeichenfolge mit All-Wide-Token erstellen, da ich dann für jede zwei Makros verwalten müsste, was nicht sehr praktisch ist und zu Fehlern führen kann. Außerdem benötige ich auch die schmale Version jeder Saite, so dass die Verwendung von All-Wide-Saiten leider ebenfalls nicht möglich ist.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage