Welche Wide-String-Struktur verwende ich? CString vs wstring

7

Ich habe eine MFC-Anwendung in C ++, die std :: string und std :: wstring verwendet und häufig von einem zum anderen umwandelt, und eine Menge anderen Unsinn. Ich muss alles auf ein einziges Format standardisieren, also habe ich mich gefragt, ob ich mit CString oder std :: wstring gehen sollte.

In der Anwendung muss ich Zeichenfolgen aus einer Zeichenfolgentabelle generieren, mit vielen Windows-Aufrufen arbeiten, die konstante Zeiger tchar oder wchar_t benötigen, Steuerelemente bearbeiten und mit der API eines COM-Objekts interagieren, die BSTR erfordert.

Ich habe auch Vektoren von Strings, also gibt es irgendein Problem mit einem Vektor von CStrings?

Welcher ist besser? Was sind die Vor- und Nachteile von jedem?

Beispiele

BSTR zu wstring

%Vor%

wstring zu BSTR

%Vor%

String-Ressource zu wstring

%Vor%

GetProfileString () gibt einen CString zurück.

Ganzzahl im Zeichenfolgenformat:

%Vor%     
Vanwaril 03.01.2010, 15:56
quelle

3 Antworten

10

std :: basic_string & lt; & gt; (oder vielmehr seine Spezialisierungen) ist schrecklich zu arbeiten, es ist einer der größten Mängel der STL (und ich würde sagen, C ++ im Allgemeinen). Es weiß nicht einmal über Codierungen - Komm schon, das ist 2010. Es ist nicht genug, die Größe deines Charakters zu definieren, weil man in einem basic_string & lt; & gt; keine Variablen in variabler Größe angeben kann. Nun, utf-8 ist nicht schön, mit einem CString zu arbeiten, aber es ist nicht so schlimm wie es mit basic_string zu tun. Während ich dem Geist der obigen Poster zustimme, dass eine Standardlösung besser ist als die Alternativen, ist CString (wenn Ihr Projekt MFC oder ATL verwendet) sowieso viel netter als std :: string / wstring: Konvertierungen zwischen ANSI / Unicode (über CStringA und CStringW), BSTR, Laden aus einer String-Tabelle, Umwandeln von Operatoren in TCHAR (.c_str ()? wirklich?), ...

CString hat auch Format (), was, obwohl nicht sicher und etwas hässlich, bequem ist. Wenn Sie sichere Formatierungsbibliotheken bevorzugen, ist basic_string besser geeignet.

Darüber hinaus verfügt CString über einige Algorithmen als Elementfunktionen, die Boost-String-Utilities für basic_string wie trim, split usw. benötigen.

Vektoren von CString sind kein Problem.

Wehren Sie sich vor einer dogmatischen Entlassung von CString auf der Grundlage davon, dass es nur Windows ist: Wenn Sie es in einer Windows-GUI verwenden, ist die Anwendung sowieso nur Windows. Wenn es eine Chance gibt, dass Ihr Code zukünftig plattformübergreifend sein muss, werden Sie mit basic_string & lt; & gt;

    
Roel 04.01.2010, 17:24
quelle
8

Ich persönlich würde in diesem Fall mit CString s gehen, da Sie angeben, dass Sie mit BSTR s arbeiten, COM verwenden und dies in MFC schreiben. Während wstring s mehr standardkonform ist, werden Sie Probleme mit der ständigen Konvertierung von einem zum anderen haben. Da Sie mit COM arbeiten und es in MFC schreiben, gibt es keinen Grund zur Sorge, es plattformübergreifend zu machen, da kein anderes Betriebssystem COM wie Windows hat und MFC Sie bereits in Windows einsperrt.

Wie Sie bereits erwähnt haben, haben CString s auch eingebaute Funktionen, die das Laden von Strings und das Konvertieren in BSTR s und dergleichen unterstützen, alles vorgefertigt und bereits für die Arbeit mit Windows entwickelt. Während Sie also auf ein Format standardisieren müssen, machen Sie es sich einfacher, damit zu arbeiten?

    
Joshua 04.01.2010 17:32
quelle
2

std :: wstring wäre viel portabler und würde von einer Menge vorhandenen, bereits geschriebenen Codes in STL und Boost profitieren. CString würde wahrscheinlich besser mit Windows-APIs gehen.

wchat_t: Denken Sie daran, dass Sie die Daten jederzeit mit der Funktion data () aus dem wstring herausholen können, damit Sie den benötigten wchar_t-Zeiger trotzdem erhalten.

BSTR: Verwenden Sie SysAllocString, um die BSTR aus einer wstring.data () abzurufen.

Beachten Sie, dass Sie für die Plattformabhängigkeit std::basic_string<T> verwenden können, um Ihre eigene Zeichenfolge zu definieren, die auf der Länge eines einzelnen Zeichens basiert.

Ich würde jeden Tag nach Wstring gehen ...

    
Kornel Kisielewicz 03.01.2010 16:00
quelle

Tags und Links