2010-01-03 5 views
7

Ho un'applicazione MFC in C++ che usa std :: string e std :: wstring, e frequentemente lancia da uno all'altro, e un sacco di altre sciocchezze. Ho bisogno di standardizzare tutto in un unico formato, quindi mi chiedevo se dovevo andare con CString o std :: wstring.Quale struttura a stringa di caratteri ampi utilizzo? CString vs wstring

Nell'applicazione, dovrò generare stringhe da una tabella di stringhe, lavorare con molte chiamate di Windows che richiedono puntatori tchar o wchar_t costanti, controlli di modifica e interagire con l'API di un oggetto COM che richiede BSTR.

Ho anche i vettori di stringhe, quindi c'è qualche problema con un vettore di CStrings?

Quale è il migliore? Quali sono i pro ed i contro di ognuno?

Esempi

BSTR a 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; 

risorsa String per wstring

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

GetProfileString() restituisce un CString.

intero in formato stringa:

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

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

+0

In realtà non era un duplicato - Volevo confrontare i due dati il ​​mio caso particolare, che aveva pro e contro per entrambi. – Vanwaril

risposta

10

std :: basic_string <> (o meglio le sue specializzazioni) è orribile con cui lavorare, è imo una delle principali carenze del STL (e Direi C++ in generale). Non sa nemmeno delle codifiche. Andiamo, questo è il 2010. Essere in grado di definire la dimensione del tuo personaggio non è abbastanza, perché non c'è modo di indicare caratteri di dimensioni variabili in una stringa_ base <>. Ora, utf-8 non è bello con cui lavorare con un CString, ma non è così male come provare a farlo con basic_string. Mentre sono d'accordo con lo spirito dei precedenti poster che una soluzione standard è migliore delle alternative, CString è (se il tuo progetto usa MFC o ATL in ogni caso) molto più bello da utilizzare rispetto a std :: string/wstring: conversioni tra ANSI/Unicode (tramite CStringA e CStringW), BSTR, caricamento da tabella string, cast operatori su TCHAR (.c_str()? veramente?), ...

CString ha anche Format(), che, sebbene non sia sicuro e alquanto brutto , è conveniente. Se preferisci le librerie di formattazione sicure, starai meglio con basic_string.

Inoltre, CString ha alcuni algoritmi come funzioni membro che avrete bisogno utilità stringa spinta per fare il basic_string come assetto, dividere ecc

Vettori di CString non sono un problema.

Protezione contro un licenziamento dogmatico di CString sulla base del fatto che sia solo per Windows: se lo si utilizza in una GUI di Windows, l'applicazione è comunque solo per Windows. Detto questo, se c'è qualche possibilità che il tuo codice abbia bisogno di essere multipiattaforma in futuro, sarai bloccato con basic_string <>.

+0

I vettori di CString sono OK, ma puoi anche usare CStringArray. – djeidot

2

std :: wstring sarebbe molto più portabile, e beneficiare di un sacco di codice prewritten esistenti in STL e in spinta. CString probabilmente andrebbe meglio con le API di Windows.

wchat_t: ricorda che è possibile ottenere i dati da wstring in qualsiasi momento utilizzando la funzione data(), in modo da ottenere comunque il puntatore wchar_t necessario.

BSTR: utilizzare SysAllocString per estrarre BSTR da wstring.data().

Per quanto riguarda la dipendenza dalla piattaforma, ricordare che è possibile utilizzare std::basic_string<T> per definire la propria stringa, in base a ciò che si desidera sia la lunghezza di un singolo carattere.

mi piacerebbe andare per wstring ogni giorno ....

+0

Ma con wstring, è problematico caricare le risorse stringa da id, e anche quando ho bisogno di ottenere dati in un buffer LPC, ho bisogno di creare buffer temporanei, ottenere i dati e quindi creare wstring da essi. – Vanwaril

+0

Pubblica il codice e lo semplificherò;) - Recentemente ho dovuto lavorare con quello, e sono stato frustrato anche da CStrings ... –

8

Personalmente vorrei andare con CString s in questo caso, dal momento che si afferma che si sta lavorando con BSTR s, utilizzando COM e scrivendo questo in MFC. Mentre wstring s sarebbe più conforme agli standard ti imbatterai in problemi con la conversione costante da uno all'altro. Dato che stai lavorando con COM e lo scrivi in ​​MFC, non c'è motivo di preoccuparti di renderlo multipiattaforma, poiché nessun altro OS ha COM come Windows e MFC ti sta già bloccando in Windows.

Come notato, gli CString s dispongono anche di funzioni integrate che consentono di caricare stringhe e convertirsi in BSTR s e simili, tutti pre-fatti e già costruiti per funzionare con Windows. Quindi, mentre è necessario standardizzare su un formato, perché non renderlo più facile da lavorare?

+3

Quando sei a Roma, fai come i romani. –