const char*類型的實參與LPCTSTR類型的形參不兼容 MFC

"const char *" 類型的實參與 "LPCTSTR" 類型的形參不兼容

http://blog.sina.com.cn/s/blog_6ccd0a110100x5y7.htm

LPCTSTR是一個windows API數據類型。與其相關還有兩個類型:LPCSTR和LPCWSTRLPCSTR:根據windows API數據類型的命名規律,LP表示該變量是一個指針,C表示是常量(const),STR表示的是字符串。因此LPCSTR是一個const char*類型。這是一個windows(ANSI)字符串常量,注意是多字節編碼的。LPCWSTR:而W表示的是寬字符,因此LPCWSTR表示的也是字符串常量,不過是Unicode編碼的。
在WinNT.h中的定義:typedef const char* LPCSTR;typedef const wchar* LPCWSTR;
最後再看LPCTSTR:根據環境配置,如果定義了UNICODE宏,則是LPCWSTR類型,否則是LPCSTR類型。

MessageBox(NULL, "Open image failed!", "error", MB_OK);

在第二個和第三個參數的地方,程序會報錯:"const char *"類型的實參與"LPCWSTR"類型的形參不兼容
首先來看MessageBox這個函數,它與LPCTSTR類似,當工程採取不同編碼方式的時候,對應的實際函數不同。當採取Unicode編碼時,實際調用的是MessageBoxW,該函數接受的參數是LPCWSTR;當採取的是多字節編碼時,實際調用的是MessageBoxA,該函數接受的參數是LPCSTR。
通常我們手動輸入的字符串都是const char*(即LPCSTR)類型的,因此只需將該句中的MessageBox改爲MessageBoxA即可。
另一種解決方法是對第二個和第三個參數使用“_T”宏:MessageBox(NULL,_T("Open image failed!"),_T("error"),MB_OK);或是:MessageBox(NULL, L"Openimage failed!", L"error",MB_OK);
關於該宏的具體含義和用法見:http://baike.baidu.com/view/2624257.htm該宏以來與工程的編碼環境。當工程是Unicode編碼時,_T將括號內的字符串以Unicode方式保存;當工程是多字節編碼時,_T將括號內的字符串以ANSI方式保存,這種情況相當於不起作用。

而另一種類似的關鍵字“L”,則是不管編碼環境是什麼,都是將其後面的字符串以Unicode方式保存。

注:關於環境的配置,可以在“工程屬性”->“常規”->“字符集”中,選擇“使用Unicode字符集”或是“使用多字節編碼字符集”(即ANSI編碼)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章