Kompatibilität von LPCTSTR und std::string



  • Wieso haben die das nicht gleich von vornherein in den Standard-String reingenommen? So dass der entsprechend definiert wird, je nachdem, ob Unicode definiert ist oder nicht?
    Was passiert eigentlich, wenn ich wstring verwende, ohne dass Unicode definiert ist? Wäre ich damit nicht auf jeden Fall auf der sicheren Seite, auch was mein ursprüngliches Problem (LPCTSTR) betrifft?



  • Also std::string und std::wstring gibts immer, unabhängig davon ob TCHAR nu char oder wchar_t ist. Bloss verwendet std::string immer char und std::wstring immer wchar_t. Du kannst aber z.B. immer den Output von std::string::c_str an MessageBoxA übergeben und den Output von std::wstring::c_str an MessageBoxW übergeben.

    Es kommt halt sehr darauf an was du machen willst. Manchmal ist es die einfachste und beste Lösung einfach auf std::string zu verzichten und nur std::wstring zu verwenden, dann wieder gibt es Fälle wo es besser ist einfach beides zu implementieren, also eine Funktion die std::string frisst und eine die std::wstring frisst. Und manchmal kann es auch Sinnvoll sein eben TCHAR zu verwenden.



  • Wo könnte es denn einen Nachteil geben, wenn ich immer wstring benutze?



  • Wenn du z.B. Libraries/APIs verwenden willst die bloss ANSI Interfaces haben (z.B. für Filenamen). Oder wenn du willst dass das Programm noch auf Win9x/ME läuft.



  • Wieso sollte es ein Problem mit Windows 95/98/ME geben, wenn ich wstring verwende? Selbst dieses alte Visual Studio 6.0 kannte schon den wstring, obwohl es für Windows 98 augelegt war ("Designed for Windows 98").



  • Klar kannst du auch wstring verwenden, aber dann mußt du darauf achten, IMMER die wchar_t-Version einer API-Funktion aufzurufen (und inwieweit ältere Systeme eine wchar_t-Version deiner Funktionen unterstützen, ist die andere Frage).



  • Aha, ja, natürlich "geht" std::wstring mit Windows 95/98/ME, aber die ganzen Unicode APIs gehen nicht. 😮
    Was willst du also mit deinen wstrings anfangen wenn du sie in keine einzige API reinstecken kannst?



  • O.k., ich glaube, ich hab's jetzt verstanden. Danke an alle.
    Noch eine Frage: Wie kann man diesen wstring eigentlich ausgeben? cout funktioniert damit nicht.



  • Ach ja, und noch etwas: Was hat es eigentlich mit dieser Funktion tmain oder _tmain auf sich?



  • Turk Turkleton schrieb:

    Noch eine Frage: Wie kann man diesen wstring eigentlich ausgeben? cout funktioniert damit nicht.

    Es gibt auch wchar_t Versionen der IO-Streams - die fangen bezeichnenderweise mit "w" an, wie z.B. "wcout" (das brauchst du).

    Ach ja, und noch etwas: Was hat es eigentlich mit dieser Funktion tmain oder _tmain auf sich?

    Das kann je nach Compiler-Optionen als main() (für char-Daten) oder wmain() (für wchar_t) erstellt werden.



  • Es gibt auch wchar_t Versionen der IO-Streams - die fangen bezeichnenderweise mit "w" an, wie z.B. "wcout" (das brauchst du).

    Der Compiler kennt aber kein wcout, zumindest nicht in der iostream.

    Das kann je nach Compiler-Optionen als main() (für char-Daten) oder wmain() (für wchar_t) erstellt werden.

    Das versteh ich mal wieder nicht. Was hat denn der Name der main mit char- oder wchat_t-Daten zu tun?



  • Turk Turkleton schrieb:

    Wieso haben die das nicht gleich von vornherein in den Standard-String reingenommen?

    Weil es in C++ keine explizite Differenzierung zwischen ASCII und UNICODE gibt.

    Turk Turkleton schrieb:

    Der Compiler kennt aber kein wcout, zumindest nicht in der iostream.

    Doch eigentlich schon (ist im std-Namensbereich definiert):

    // In der Datei IOSTREAM:
    extern _CRTIMP wostream wcout, wcerr, wclog;
    

    Turk Turkleton schrieb:

    Das versteh ich mal wieder nicht. Was hat denn der Name der main mit char- oder wchat_t-Daten zu tun?

    Guck Dir mal die erweiterte Version der main() mit Parametern an... . Dann siehst du warum man zwischen char und wchar_t unterscheidet.

    ➡ main(...)/wmain(...) (MSDN, C++ Reference)



  • Komisch: Unter Linux mit dem GCC geht's. Unter Windows mit dem MinGW geht's nicht ('wcout' undeclared (first use this function)).



  • Weiß einer, warum das so ist. Ich dachte, der MinGW wäre standardkonform.



  • Soll ich Dich ins "Compiler-Forum" verschieben!? Aber nach dem Titel zu urteilen, wäre esinnvoller, Du würdest diese Frage dort nochmal neu stellen...



  • Turk Turkleton schrieb:

    Weiß einer, warum das so ist. Ich dachte, der MinGW wäre standardkonform.

    guckst du: http://www.mingw.org/MinGWiki/index.php/wide characters


Anmelden zum Antworten