2010-01-03 15 views
7

Tengo una aplicación MFC en C++ que usa std :: string y std :: wstring, y frecuentemente lanza de una a la otra, y un montón de otras tonterías. Necesito estandarizar todo en un solo formato, así que me preguntaba si debería ir con CString o std :: wstring.¿Qué estructura de cadena de caracteres anchos uso? CString vs wstring

En la aplicación, necesitaré generar cadenas desde una tabla de cadenas, trabajar con muchas llamadas de Windows que requieren punteros tchar o wchar_t constantes, Editar Controles e interactuar con la API de un objeto COM que requiere BSTR.

También tengo vectores de cadenas, ¿hay algún problema con un vector de CStrings?

¿Cuál es mejor? ¿Cuáles son los pros y los contras de cada uno?

Ejemplos

BSTR para wstring

CComBSTR tstr; 
wstring album; 
if((trk->get_Info((BSTR *)&tstr)) == S_OK && tstr!= NULL) 
    album = (wstring)tstr; 

wstring a BSTR

CComBSTR tstr = path.c_str(); 
if(trk->set_Info(tstr) == S_OK) 
    return true; 

recurso de cadena a wstring

CString t; 
wstring url; 
t.LoadString(IDS_SCRIPTURL); 
url = t; 

GetProfileString() devuelve un CString.

entero en formato de cadena:

wchar_t total[32]; 
swprintf_s(total, 32, L"%d", trk->getInt()); 
wstring tot(total); 
+0

Duplicado: http://stackoverflow.com/questions/485654/pros-and-cons-of-different-string-types-in-c http://stackoverflow.com/questions/133364/how-do- you-handle-strings-in-c –

+0

No era realmente un duplicado - Quería comparar los dos dado mi caso particular, que tenía ventajas y desventajas para ambos. – Vanwaril

Respuesta

10

std :: basic_string <> (o más bien sus especializaciones) es horrible para trabajar, es imo una de las principales deficiencias de la STL (y Diría C++ en general). Ni siquiera sabe sobre codificaciones - vamos, esto es 2010. Ser capaz de definir el tamaño de tu personaje no es suficiente, porque no hay manera de indicar caracteres de tamaño variable en una cadena_ básica <>. Ahora, utf-8 no es agradable para trabajar con un CString, pero no es tan malo como tratar de hacerlo con basic_string. Si bien estoy de acuerdo con el espíritu de los carteles anteriores de que una solución estándar es mejor que las alternativas, CString es (si su proyecto usa MFC o ATL de todos modos) mucho mejor para trabajar que std :: string/wstring: conversiones entre ANSI/Unicode (a través de CStringA y CStringW), BSTR, cargando desde la tabla de cadenas, operadores de molde a TCHAR (.c_str()? really?), ...

CString también tiene Format(), que, aunque no es seguro y algo feo , es conveniente. Si prefiere librerías formateadoras seguras, estará mejor con basic_string.

Además, CString tiene algunos algoritmos como funciones miembro que necesitará utilidades cadena impulso para hacer el basic_string tales como recorte, dividir etc.

vectores de CString no son un problema.

Protéjase contra el rechazo dogmático de CString sobre la base de que es solo para Windows: si lo usa en una GUI de Windows, la aplicación es solo de Windows de todos modos. Dicho eso, si hay alguna posibilidad de que tu código necesite ser multiplataforma en el futuro, vas a estar atascado con basic_string <>.

+0

Los vectores de CString están bien, pero también puede usar CStringArray. – djeidot

2

std :: wstring sería mucho más fáciles de transportar, y beneficiarse de una gran cantidad de código escrito previamente en AWL y en alza. CString probablemente sea mejor con las API de Windows.

wchat_t: recuerde que puede obtener los datos de wstring en cualquier momento mediante el uso de la función data(), de modo que obtiene el puntero wchar_t necesario de todos modos.

BSTR: utilice SysAllocString para obtener el BSTR de un wstring.data().

En cuanto a la dependencia de la plataforma, recuerde que puede usar std::basic_string<T> para definir su propia cadena, en función de lo que desee que sea la longitud de un solo carácter.

yo iría a wstring todos los días ....

+0

Pero con wstring, es problemático cargar recursos de cadenas por id, y también cuando necesito obtener datos en un búfer LPC. Necesito crear búferes temporales, obtener los datos y luego crear cadenas de ws de ellos. – Vanwaril

+0

Publique el código, y lo simplificaré;) - Recientemente tuve que trabajar con eso, y me sentí frustrado en CStrings también ... –

8

Yo personalmente iría con CString s en este caso, ya que indica que está trabajando con BSTR s, utilizando COM y escribiendo esto en MFC. Mientras que wstring s cumplirían más estándares, se encontrará con problemas con la conversión constante de uno a otro. Dado que está trabajando con COM y escribiéndolo en MFC, no hay motivos reales para preocuparse por hacerlo multiplataforma, ya que ningún otro sistema operativo tiene COM como Windows y MFC ya lo está bloqueando en Windows.

Como mencionó, CString s también tienen funciones incorporadas para ayudar a cargar cadenas y convertir a BSTR sy similares, todas prefabricadas y ya construidas para funcionar con Windows. Entonces, si bien necesita estandarizar en un formato, ¿por qué no hacerlo más fácil de trabajar?

+3

Cuando estés en Roma, haz lo que hacen los romanos. –

Cuestiones relacionadas