2012-05-24 10 views
6

Wie _T() Makro in Visual Studio auf wchar_t, I definiert und verwendet meine eigene _L Makro wie:wie Makro definieren verketteten char Zeichenfolge zu konvertieren Zeichenfolge in C

wprintf(_L("abc\n")); 
:

#define _L(x) __L(x) 
#define __L(x) L ## x 

Es ist für Arbeiten

Aber bekommt einen Kompilierungsfehler für:

wprintf(_L("abc\n""def\n")); 

Es berichtet "Zeichenfolgenliterale mit verschiedenen Zeichenarten können nicht verkettet werden".
Ich habe auch:

#define _L2(x) __L2(x) 
#define __L2(x) L ## #x 
wprintf(_L2("abc\n""def\n")); 

Der Code kompiliert wird, aber die \n als Escape-Sequenz einer neuen Linie nicht funktioniert. Die \n wird zwei Zeichen, und der Ausgang des wprintf ist:

"abc \ n" "def \ n"

Wie ich ein Makro zwei bis wchar_t verketteten char Zeichenfolge zu konvertieren haben kann? Das Problem ist, ich habe einige bereits bestehende Makros:

#define BAR "The fist line\n" \ 
      "The second line\n" 

Ich möchte, dass sie zu einer wchar Zeichenfolge während der Kompilierung verdeckte. Der Compiler ist ICC in Windows.

bearbeiten:
Die _L Makro funktioniert in gcc, die MSVC und ICC nicht funktioniert hat, es ist ein Compiler-Fehler. Danke @R .. um mich zu kommentieren.

+0

Wenn ich mich richtig erinnere, müssen Sie nicht Makro schreiben. Platzieren Sie die Saite einfach nebeneinander und sie werden automatisch in eine kombiniert. Zumindest funktioniert das für gcc. – nhahtdh

+4

Dies ist ein reiner Fehler in MSVC. Die C-Sprachen ermöglichen das Verketten von Strings unterschiedlicher Breite, und das Ergebnis ist eine breite Zeichenfolge. –

+0

@nhahtdh Ich bin nicht zwei Saiten concat. Ich möchte die kontaktierte Zeichenfolge in wchar konvertieren. – RolandXu

Antwort

2

Ich glaube nicht, dass Sie das tun können.

Makros machen einfach Textverarbeitung. Sie können L am Anfang hinzufügen, aber können nicht sagen, dass "abc\n" "def\n" sind zwei Zeichenfolgen, die L zweimal hinzufügen müssen.

Sie können Fortschritte machen, wenn Sie die Saiten an das Makro durch Komma getrennt passieren, anstatt verketteten:
L("abc\n", "def\n")

Es trivial ist L zu definieren, die genau zwei Strings akzeptiert:
#define L2(a,b) _L(a) _L(b)
es verallgemeinernd ein einzelnes Makro zu haben, das eine beliebige Anzahl von Parametern erhält und L s an der richtigen Stelle hinzufügt, ist möglich, aber komplizierter. Sie können clevere Makros finden, die solche Dinge in Jens Gustedt's P99 macros tun.

+0

+1 für den Link zu P99. – 0xC0000022L

+0

Ja, ich kann, wenn der C-Compiler den C99-Standard korrekt unterstützt, wie GCC. eine andere Frage sagte http://stackoverflow.com/questions/2192416/how-to-convert-concatenated-strings-to-wide-char-with-the-c-preprocessor – RolandXu

+0

@RolandXu, der Präprozessor kann nicht was tun er will, dh erzeuge "L" abc "L" def "'. Der Compiler kann (obwohl MSVC nicht zu scheint) "L" abc "" def "als ganze Wide-Zeichenkette behandeln. – ugoren