作者adrianshum (Alien)
看板C_and_CPP
標題Re: [問題] vc++ 字元集設定
時間Mon Feb 15 11:09:53 2010
※ 引述《carl71321 (Christopher)》之銘言:
: ( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 )
: ( 未必需要依照此格式,文章條理清楚即可 )
: 遇到的問題: (題意請描述清楚)
: 宣告了一函數如下,如果把visual studio
: 內專案的字元集設定設定成UNICODE,編譯後即會出現
: 錯誤 1 error C2664: '
: std::basic_string<_Elem,_Traits,_Ax>
: &std::basic_string<_Elem,_Traits,_Ax>::
: append(const std::basic_string<_Elem,_Traits,_Ax> &)'
: : 無法將參數 1 從 'LPCTSTR' 轉換成
: 'const std::basic_string<_Elem,_Traits,_Ax> &'
: 但如使用多位元組字元集,即能夠正確的編譯,請問這是什麼呢?
: 先謝謝大家的幫忙。
: string MakeGlobalName(LPCTSTR lpsName) {
: string ret;
: ret = GN_ROOT;
: ret.append(lpsName);
: return ret;
: };
: 使用的平台為visual studio 2008 win32主控台應用程式。
因為 LPCTSTR (其實所有 TCHAR 系列的東西都一樣)
會根據你是 UNICODE 還是 MBCS 來決定是替換成 wchar_t
還是 char.
std::string 其實是 std::basic_string<char>
在 UNICODE 的環境裡面,你的 method 其實是:
basic_string<char> MakeGlobalName(wchar_t* lpsName) {
basic_string<char> ret;
ret = GN_ROOT; // 我猜 GN_ROOT 也是 LPCTSTR 吧?
// 即是也是 wchar_t*
ret.append(lpsName);
return ret;
}
ret expect 的是 char, 你傳的東西是 wchar_t, 當然出問題了。
解決方法之一就是讓 ret 也會根據 UNICODE/MCBS 來變成適當
的 type:
basic_string<TCHAR> MakeGlobalName(LPCTSTR name) {
basic_string<TCHAR> ret;
:
:
}
(忘了 VC++ 有沒有提供方便的 macro 替換 basic_string<TCHAR> 了)
解決方法二就是... 只 support UNICODE, 東西也通通直接寫 UNICODE
的版本(wchar_t, std::wstring etc).... :P
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.79.103.239
※ 編輯: adrianshum 來自: 219.79.103.239 (02/15 11:12)
推 carl71321:GNROOT使用下述指令定義 02/15 12:18
→ carl71321:#define GN_ROOT "Global\\" 02/15 12:18
推 carl71321:覺得奇怪的地方就是為什麼使用多位元組字元集後,string 02/15 12:21
→ carl71321:就能去接LPCTSTR 02/15 12:24
→ carl71321:此時的string不是std::basic_string<char>嗎? 02/15 12:25
→ carl71321:謝謝你的回答 02/15 12:25
→ adrianshum:因為 MBCS 底下,TCHAR 就單純是 char 而已,一切都是 02/15 13:24
→ adrianshum:char (LPTCSTR = char*, string = basic_string<char>) 02/15 13:25
→ adrianshum:所以當然沒問題 02/15 13:25
→ adrianshum:btw, 恐怕 GN_ROOT 也可能有問題 (不太肯定) 02/15 13:26