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 Form

    printf("%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.


Anmelden zum Antworten