2010-01-03 9 views
7

Mam aplikacji MFC w C++, która używa std :: string i std :: wstring, a często rzuca od jednego do drugiego, a także wiele innych nonsens. Potrzebuję ujednolicić wszystko do jednego formatu, więc zastanawiałem się, czy powinienem pójść z CStringiem czy std :: wstringiem.Jakich struktur ciągów o szerokich znakach używam? CString vs Wstring

W aplikacji będę musiał wygenerować ciągi z tabeli ciągów, pracować z wieloma wywołaniami Windows, które wymagają stałych wskaźników tchar lub wchar_t, edytować formanty i współdziałać z interfejsem API obiektu COM, który wymaga BSTR.

Mam również wektory ciągów znaków, więc czy jest jakiś problem z wektorem CStrings?

Który z nich jest lepszy? Jakie są plusy i minusy każdego?

Przykłady

BSTR do wstring

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

wstring do BSTR

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

zasób String wstring

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

GetProfileString() zwraca CString.

całkowitą do formatu ciąg:

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

Duplikat: 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

Nie był tak naprawdę duplikatem - chciałem porównać te dwie z moich konkretnych przypadków, które miały plusy i minusy dla obu. – Vanwaril

Odpowiedz

10

std :: basic_string <> (lub raczej jego specjalizacji) jest straszne pracować, to imo jeden z głównych mankamentów STL (i Powiedziałbym ogólnie C++). Nie wie nawet o kodowaniu - chodź, to jest 2010 r. Nie jestem w stanie określić rozmiaru twojej postaci, ponieważ nie ma możliwości wskazania znaków o zmiennych rozmiarach w basic_string <>. Teraz utf-8 nie jest przyjemny w pracy z CStringiem, ale nie jest tak zły, jak próba zrobienia tego przy pomocy basic_string. Chociaż zgadzam się z duchem powyższych plakatów, że standardowe rozwiązanie jest lepsze niż alternatywy, CString jest (jeśli twój projekt korzysta z MFC lub ATL), o wiele lepszy do pracy niż std :: string/wstring: konwersje między ANSI/Unicode (przez CStringA i CStringW), BSTR, ładowanie z tabeli strun, operatory rzutowania na TCHAR (.c_str()? naprawdę?), ...

CString ma również format(), który, choć nie jest bezpieczny i nieco brzydki , jest wygodne. Jeśli wolisz bezpieczne biblioteki formatowania, lepiej będzie z basic_string.

Ponadto CString ma pewne algorytmy jak funkcje członkowskich, które będą Ci potrzebne narzędzia doładowania ciągów do zrobić na basic_string takie jak przycinanie, podzielone itp

Wektory CString nie są problemem.

Zabezpiecz się przed dogmatycznym zwolnieniem z CString, ponieważ jest to tylko system Windows: jeśli używasz go w graficznym interfejsie Windows, aplikacja jest przeznaczona tylko dla systemu Windows. W związku z tym, jeśli istnieje szansa, że ​​Twój kod będzie musiał być w przyszłości obsługiwany przez wiele platform, utkniesz w trybie basic_string <>.

+0

Wektory CString's są OK, ale możesz również użyć CStringArray. – djeidot

2

std :: wstring byłby znacznie bardziej przenośne, i korzystać z wielu istniejącego kodu prewritten w STL oraz w przypominającej. CString prawdopodobnie poprawiłby się z Windows API.

wchat_t: pamiętaj, że możesz pobierać dane z łańcuchów w dowolnym momencie za pomocą funkcji data(), więc i tak otrzymasz potrzebny wskaźnik wchar_t.

BSTR: użyj SysAllocString, aby usunąć BSTR z wstring.data().

Jeśli chodzi o zależność od platformy, pamiętaj, że możesz użyć std::basic_string<T> do zdefiniowania własnego ciągu znaków, w zależności od długości pojedynczego znaku.

pójdę do wstring codziennie ....

+0

Ale z Wstringiem jest kłopotliwe ładowanie zasobów ciągów przez id, a także kiedy potrzebuję uzyskać dane w buforze LPC - potrzebuję utworzyć tymczasowe bufory, pobrać dane, a następnie utworzyć z nich łańcuchy. – Vanwaril

+0

Napisz kod, a ja go uprość;) - Niedawno musiałem z tym pracować i sfrustrowałem w CStrings również ... –

8

Osobiście pójdę z CString s w tym przypadku, ponieważ oświadczasz, że pracujesz z BSTR s, używając COM, i piszesz to w MFC. Podczas gdy wstring s byłoby bardziej zgodne z normami, napotkasz problemy z ciągłą konwersją między nimi. Ponieważ pracujesz z COM i zapisujesz go w MFC, nie ma żadnego powodu, by martwić się o to, że będzie on działać na wielu platformach, ponieważ żaden inny system operacyjny nie ma portu COM takiego jak Windows, a MFC blokuje cię już w systemie Windows.

Jak zauważyłeś, CString s mają również wbudowane funkcje, które pomagają załadować ciągi i przekonwertować je na BSTR s i tym podobne, wszystkie wcześniej przygotowane i już zbudowane do pracy z systemem Windows. Więc jeśli chcesz standaryzować w jednym formacie, dlaczego nie ułatwić pracy?

+3

Kiedy w Rzymie, rób tak, jak robią to Rzymianie. –

Powiązane problemy