Verschachtelte Makros
-
Moin moin,
ich habe ein Problem mit einem Makro, guckst du:typedef wchar_t vchar; #define vprint wprintf #define V(x) L ##x #define _S %ls int main ( void ) { vchar* s = V("Hello world!"); vprint ( V("%ls\n"), s ); // OK, Ausgabe: Hello world! // Die folgende Zeile soll das gleiche tun wie die obige, tut sie aber nicht :D vprint ( V("_S\n"), s ); // Nicht OK, Ausgabe: _S return 0; }
In den Kommentaren steht was ich vorhabe.
Wie kann ich das Makro umschreiben, damit es mit der Ausgabe funktioniert?
-
Das Problem liegt daran, dass das "_S\n" ein Stringliterl ist. Und die werden vom Preprozessor nicht geändert.
Verschachtelte Makros wäre das:
#define _S "%ls" vprint ( V(_S"\n"), s );
-
Das frisst mein Compiler leider nicht
error C2143: Syntaxfehler: Es fehlt ')' vor 'Zeichenfolge'
error C2059: Syntaxfehler: ')'
-
typedef wchar_t vchar; #define vprint wprintf #define V(s) str(s) #define str(s) L#s int main ( void ) { vchar* s = V(Hello world!); vprint ( V(%ls\n), s ); // OK, Ausgabe: Hello world! // Die folgende Zeile soll das gleiche tun wie die obige, tut sie aber nicht :D vprint ( V(%ls)V(\n), s ); // Nicht OK, Ausgabe: _S return 0; }
-
Danke Wutz!
-
Das ist jetzt aber nicht ganz vergleichbar, da das %ls nicht mehr im define steht.
-
Stimmt.
Das %ls soll per Preprozessor in den Formatstring eingefügt werden und je nach
#ifdef Anweisung gegen ein %s austauschbar sein.#ifdef _WIN32 typedef wchar_t vchar; #define vprint wprintf #define V(x) L ##x #define _S %ls #endif #ifdef __linux__ typedef char vchar; #define vprint printf #define V(x) x #define _S %s #endif int main ( void ) { vchar* s = V("Hello world!"); vprint ( V("%ls\n"), s ); // OK, Ausgabe: Hello world! // Die folgende Zeile soll das gleiche tun wie die obige, tut sie aber nicht :D vprint ( V("_S\n"), s ); // Nicht OK, Ausgabe: _S. Soll aber Hello world! mit einem Zeilenumbruch ausgeben. return 0; }
Gibt es dafür eine Lösung?
-
Aaach drauf ge***!
Ich machs ohne das Makro.
-
Noch ein Vorschlag
#define V(x) VV(x) #define VV(x) L ##x #define _S "%ls" ... vprint ( V(_S"\n"), s );
-
Da weigert sich mein Compiler ebenfalls beharrlich, das zu übersetzen.
Selbst wenn es ginge, Ausgaben der Formprintf("%s %dkg %s.\n", "Du hast heute", 6, "Kuchen gegessen");
wären nicht möglich.
Ich werde mal sehen, ob ich mir mit Microsofts TCHAR etwas zurecht basteln kann und dann für Linux einfach TCHAR als char definiere.
Was mich wundert, das Ausgaben von wchar_t Strings (argv[1] kann wchar_t Typ sein)_tprintf(TEXT("Wrote %d bytes to %s successfully.\n"), dwBytesWritten, argv[1]);
möglich sind.
Eigentlich sollte da laut Standard ein %ls rein, aber hier scheinen die von Microsoft ihr eigenes Süppchen zu kochen.