1. 程式人生 > >"const char*"型別的實參與LPCTSTR型別的形參不相容問題

"const char*"型別的實參與LPCTSTR型別的形參不相容問題

"const char*"型別的實參與LPCTSTR型別的形參不相容 1、LPCTSTR是什麼? A  32-bit pointer to a contant character stirng that is portable forUnicode and DBCS(double-byte character sets) LPCTSTR就是一個32-bit指標指向一個常字串,每字元可能佔1位元組或2位元組,取決於Unicode是否定義
LPCTSTR是一個windows API資料型別。根據windows API資料型別的命名規律: 1)L——long 指標,是為了相容Window3.1等16位扣件系統遺留下來的, 在Win32中以及其他的32的扣件系統中,long 指標和near 指標及far 修飾符都是為了相容的作用,而沒有實際意義。 2)P表示該變數是一個指標,C表示是常量(const),STR表示的是字串。因此LPCSTR是一個const char*型別。 這是一個windows(ANSI)字串常量,它是多位元組編碼的。
3)LPCWSTR:而W表示的是寬字元,因此LPCWSTR表示的也是字串常量,不過是Unicode編碼的。


注:
1)LPCTSTR:根據環境配置,如果定義了UNICODE巨集,則是LPCWSTR型別,否則是LPCSTR型別。
2)這裡的Unicode是Wondows的一種字符集 Windows使用兩種字符集ANSI和UNICODE, ANSI就是通常使用的單位元組方式,但這種方式處理象中文這樣的雙位元組字元不方便, 容易出現半個漢字的情況。UNICODE是雙位元組方式,方便處理雙位元組字元。 2、問題的解決 通常我們手動輸入的字串都是const char*(即LPCSTR)型別的,若出現不相容 可以對輸入的引數用使用“_T”巨集: 例如: MessageBox("Help,Somethig went wong.","Error",MB_ICONERROR|MB_OK);
在第一個和第二個引數的地方,程式會報錯:"const char *"型別的實參與"LPCWSTR"型別的形參不相容 這是第一個和第二個引數都是我們手動輸入的字串,都為const char * 型別的,而以上的兩個引數均為LPCTSTR型別。 MessageBox這個函式,它與LPCTSTR類似,當工程採取不同編碼方式的時候,對應的實際函式不同。當採取Unicode編碼時,實際呼叫的是MessageBoxW,該函式接受的引數是LPCWSTR;
當採取的是多位元組編碼時,實際呼叫的是MessageBoxA,該函式接受的引數是LPCSTR。
解決方法是對第一個和第二個引數使用“_T”巨集:
MessageBox(_T("Help,Something went wrong"),_T("Error"),MB_OK);

_T("")是一個巨集,他的作用是讓你的程式支援Unicode編碼. --------- 不過我用_T 會有未定義的識別符號的錯誤提示,最後的通過設定編碼型別解決的。