Kompatibilität von LPCTSTR und std::string



  • 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