2010-01-03 63 views
7

我有一個使用std :: string和std :: wstring的C++中的MFC應用程序,並且經常從一個轉換到另一個,還有一大堆其他的廢話。我需要將所有內容標準化爲單一格式,所以我想知道是否應該使用CString或std :: wstring。我使用哪種寬字符字符串結構? CString vs wstring

在應用程序中,我將需要從字符串表中生成字符串,需要使用大量需要常量tchar或wchar_t指針,編輯控件的Windows調用,並與需要BSTR的COM對象的API進行交互。

我也有字符串的向量,所以有CStrings向量有任何問題嗎?

哪一個更好?每個的優缺點是什麼?

實例

BSTR到wstring的

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

的wstring到BSTR

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

字符串資源wstring的

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

GetProfileString()返回一個CString。

整數字符串格式:

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

Duplicate:http://stackoverflow.com/questions/485654/pros-and-cons-of-different-string-types-in-c http://stackoverflow.com/questions/133364/how-do-你處理字符串在C – 2010-01-04 17:37:34

+0

是不是真的重複 - 我想比較兩個給我的特殊情況,這對兩者都有優點和缺點。 – Vanwaril 2010-01-26 03:44:12

回答

10

的std :: basic_string的<>(或者更確切地說,其特)是可怕的工作,這是國際海事組織的STL的主要缺陷之一(和一般來說我會說C++)。它甚至不知道編碼 - 來吧,這是2010年。能夠定義你的字符的大小是不夠的,因爲沒有辦法指示基本字符串中的可變大小的字符。現在,utf-8與CString一起工作並不好,但它並不像使用basic_string那樣糟糕。雖然我同意上述海報的精神,即標準解決方案比替代方案更好,但CString(如果您的項目使用MFC或ATL)比std :: string/wstring更適合:ANSI/Unicode之間的轉換(通過CStringA和CStringW),BSTR,從字符串表加載,演員操作符到TCHAR(.c_str()?真的?),...

CString也有格式化(),雖然不安全,有點難看,很方便。如果你更喜歡安全的格式化庫,你最好用basic_string。

此外,CString的有一些算法,你會需要升壓字符串工具用於對basic_string的如裝飾做的成員函數,分割等的CString的

載體都沒有問題。

禁止基於Windows的CString的教條式解僱:如果您在Windows GUI中使用它,該應用程序無論如何都是Windows。話雖如此,如果將來您的代碼有可能需要跨平臺的話,那麼您將被困在basic_string <>中。

+0

CString的向量可以,但是您也可以使用CStringArray。 – djeidot 2010-01-05 12:52:43

2

的std :: wstring的會更便攜,並從STL和提升了很多現有的預先寫好的代碼的好處。 CString可能會更好地與Windows API的。

wchat_t:記住,您可以隨時使用data()函數從wstring中獲取數據,因此無論如何您都可以獲得所需的wchar_t指針。

BSTR:使用SysAllocString將BSTR從wstring.data()中取出。

至於平臺依賴性,請記住,您可以使用std::basic_string<T>來定義您自己的字符串,這取決於您希望單個字符的長度。

我會去每天wstring的....

+0

但是對於wstring,通過id加載字符串資源是非常麻煩的,而且當我需要在LPC緩衝區中獲取數據時 - 我需要創建臨時緩衝區,獲取數據,然後從它們創建wstrings。 – Vanwaril 2010-01-03 16:04:46

+0

發佈代碼,我會簡化它;) - 我最近不得不使用它,並且在CStrings中也感到沮喪... – 2010-01-03 16:10:58

8

在這種情況下,我個人會使用CString s,因爲您聲明您正在使用COM,並使用COM編寫此代碼並使用BSTR。雖然wstring會更符合標準,但您會遇到不斷從一個轉換到另一個的問題。由於您正在使用COM並在MFC中編寫它,所以沒有必要擔心它是跨平臺的,因爲沒有其他操作系統具有像Windows那樣的COM,並且MFC已經將您鎖定到Windows中。

正如您所指出的那樣,CString也具有內置函數來幫助加載字符串並轉換爲BSTR等,所有這些都是預製的,並且已經與Windows一起構建。所以,當你需要對一種格式進行標準化時,爲什麼不能更容易地使用?

+3

在羅馬時,像羅馬人那樣做。 – 2010-01-04 17:35:35