VC++?2019?"const?char*"類(lèi)型的實(shí)參與"LPCTSTR"類(lèi)型的形參不兼容解決
一、問(wèn)題描述
項(xiàng)目使用Unicode編碼,當(dāng)使用tinyxml2讀取xml內(nèi)容時(shí),利用root->Name()獲取的是const char*類(lèi)型的字符串,直接傳遞給Edit->SetWindowTextW(),報(bào)以下錯(cuò)誤
嚴(yán)重性 代碼 說(shuō)明 項(xiàng)目 文件 行 禁止顯示狀態(tài)
錯(cuò)誤(活動(dòng)) E0167 “const char *” 類(lèi)型的實(shí)參與 “LPCTSTR” 類(lèi)型的形參不兼容 MFCTinyxml2 C:\WebSite\MFCTinyxml2\MFCTinyxml2Dlg.cpp 106

導(dǎo)致無(wú)法正常編譯

嚴(yán)重性 代碼 說(shuō)明 項(xiàng)目 文件 行 禁止顯示狀態(tài)
錯(cuò)誤 C2664 “void CWnd::SetWindowTextW(LPCTSTR)”: 無(wú)法將參數(shù) 1 從“const char *”轉(zhuǎn)換為“LPCTSTR” MFCTinyxml2 C:\WebSite\MFCTinyxml2\MFCTinyxml2Dlg.cpp 106
二、解決辦法
1、使用微軟提供的ANSI轉(zhuǎn)寬字符的函數(shù)MultiByteToWideChar,將char* 轉(zhuǎn)換成 wchar_t*(寬字符)
2、再賦值給接受LPCTSTR寬字符類(lèi)型的參數(shù),就不再報(bào)錯(cuò)

附加示例代碼:
const char* name = elmtRoot->Name(); //先獲取轉(zhuǎn)換成寬字符后的長(zhǎng)度(一定要通過(guò)這種方式,先回去字符長(zhǎng)度,因?yàn)橛兄付ň幋a為CP_ACP,編碼不同,長(zhǎng)度也會(huì)不同) int nLen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, NULL, 0); //聲明一個(gè)寬字符類(lèi)型變量,用于存放轉(zhuǎn)換后的字符 wchar_t* wname = new wchar_t[nLen]; //利用微軟ANSI轉(zhuǎn)寬字符的函數(shù)(name:ANSI字符,wname:寬字符) MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, name, -1, wname, nLen); pEditXml->SetWindowText(wname);
多啰嗦幾句:
1、網(wǎng)上有一些文章直接建議將VC++環(huán)境的字符集換成“多字節(jié)字符集”,強(qiáng)烈不建議這樣做,因?yàn)閁nicode是等同于UTF-8的編碼格式,而多字節(jié)等同于GB2312(非國(guó)際化編碼)

2、使用同一個(gè)函數(shù)/方法,網(wǎng)上示例卻可以直接傳char類(lèi)型的參數(shù),而我卻一定要轉(zhuǎn)成寬字符wchar_t的才行呢?
因?yàn)橥瑯右粋€(gè)參數(shù),VS為了國(guó)際化,目前默認(rèn)字符集為“使用Unicode字符集”,以前大部分教程都是老版本VS或其他C++開(kāi)發(fā)工具,因此無(wú)需轉(zhuǎn)換,直接就可以接受char*類(lèi)型的參數(shù)。
按住Ctrl鍵,打開(kāi)VS中的方法定義,可以看出使用UNICODE字符集時(shí),會(huì)自動(dòng)對(duì)應(yīng)SetWindowTextW(LPCWSTR str),否則對(duì)應(yīng)SetWindowTextA(LPCSTR str)


3、要求傳參是LPCWSTR的,為何報(bào)錯(cuò)是無(wú)法轉(zhuǎn)換成LPCTSTR呢?
注:此問(wèn)題我至今未解惑,只了解到以下邏輯關(guān)系,大致可理解,但還有不通的地方
- LPCTSTR == const TCHAR* == CString,可根據(jù)代碼環(huán)境UNICODE/ANSI做適配的變量類(lèi)型
- LPCWSTR = const wchar_t*,只存放UNICODE
總結(jié)
到此這篇關(guān)于VC++ 2019 "const char*"類(lèi)型的實(shí)參與"LPCTSTR"類(lèi)型的形參不兼容解決的文章就介紹到這了,更多相關(guān)VC++ const char*實(shí)參與LPCTSTR形參不兼容內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VS2019中CMake項(xiàng)目的簡(jiǎn)單使用方法
這篇文章主要介紹了VS2019中CMake項(xiàng)目的簡(jiǎn)單使用方法,需要的朋友可以參考下2020-02-02
C語(yǔ)言中for循環(huán)問(wèn)題(一個(gè)小坑需注意)
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中for循環(huán)問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
C++用mysql自帶的頭文件連接數(shù)據(jù)庫(kù)
現(xiàn)在正做一個(gè)接口,通過(guò)不同的連接字符串操作不同的數(shù)據(jù)庫(kù)。要用到mysql數(shù)據(jù)庫(kù)。通過(guò)網(wǎng)上的一些資料和自己的摸索,大致清楚了C++連接mysql的方法??梢酝ㄟ^(guò)2種方法實(shí)現(xiàn)。第一種方法是利用ADO連接,第二種方法是利用mysql自己的api函數(shù)進(jìn)行連接。今天主要來(lái)講解下使用API2016-07-07
C++實(shí)現(xiàn)LeetCode(10.正則表達(dá)式匹配)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(10.正則表達(dá)式匹配),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++實(shí)現(xiàn)簡(jiǎn)易的彈球小游戲
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)易的彈球小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10

