LPCTSTR —— 摘自百度百科

LPCTSTR用來表示字符是否使用UNICODE。 若是程序定義了UNICODE或者其餘相關的宏,那麼這個字符或者字符串將被做爲UNICODE字符串,不然就是標準的ANSI字符串。安全

類型理解:
L,表示long指針。這是爲了兼容Windows 3.1等16位操做系統遺留下來的,在win32中以及其餘的32位操做系統中, long指針和near指針及far修飾符都是爲了兼容的做用。沒有實際意義。
P,表示這是一個指針。
C,表示是一個常量。
T,表示在Win32環境中, 有一個_T宏。
STR,表示這個變量是一個字符串。函數

詳細釋義:
A 32-bit pointer to a constant character string that is portable for Unicode and DBCS.
因此,LPCTSTR表示一個指向const對象的指針。
在程序中,大部分時間要使用帶T的類型定義。
LPCTSTR == const TCHAR *操作系統

CString 和 LPCTSTR, LPTSTR
CString 和 LPCTSTR 能夠說通用。 緣由在於CString定義的自動類型轉換,最簡單的C++操做符重載。
常量字符串ansi和unicode的區分是由宏_T來決定的。可是用_T("abcd")時, 字符串"abcd"就會根據編譯時是否認是_UNICODE來決定是char* 仍是 wchar_t*。 一樣,TCHAR 也是相同目的字符宏。
簡單起見,下面只介紹 ansi 的狀況,unicode 能夠類推。
ansi狀況下,LPCTSTR 就是 const char*, 是常量字符串(不能修改的)
LPTSTR 就是 char*, 即普通字符串(很是量,可修改的)
這兩種都是基本類型, 而CString 是 C++類, 兼容這兩種基本類型是最起碼的任務了。
因爲const char* 最簡單(常量,不涉及內存變動,操做迅速), CString 直接定義了一個類型轉換函數:指針

operator LPCTSTR( )
{.
.....
}code

CString 轉LPCTSTR:
CString cStr;
const char *lpctStr=(LPCTSTR)cStr;對象

LPCTSTR轉CString:
LPCTSTR lpctStr;
CString cStr=lpctStr;內存

函數直接返回所維護的字符串。
當須要一個const char* 而傳入了CString時, C++編譯器自動調用 CString重載的操做符 LPCTSTR()來進行隱式的類型轉換。
當須要CString , 而傳入了 const char* 時(其實 char* 也能夠),C++編譯器則自動調用CString的構造函數來構造臨時的 CString對象。
所以CString 和 LPCTSTR 基本能夠通用。unicode


可是 LPTSTR又不一樣了,它是 char*, 意味着隨時可能修改裏面的數據,這就須要內存管理了(如字符串變長,原來的存貯空間就不夠了,則須要從新調整分配內存)
因此, 不能隨便的將 const char* 強制轉換成 char* 使用。字符串

例如:
LPSTR lpstr = (LPSTR)(LPCTSTR)string;
就是這種不安全的使用方法。
這個地方使用的是強制類型轉換,你都強制轉換了,C++編譯器固然不會拒絕你,但同時他也認爲你確實知道本身要作的是什麼。所以是不會給出警告的。
強制的任意類型轉換是C(++)的一柄雙刃劍。這一問題在 vc6 之後的版本(僅針對vc而言)中獲得逐步的改進(你須要更明確的類型轉換聲明)。
其實在不少地方均可以看到相似LPSTR lpstr = (LPSTR)(LPCTSTR)string; 的用法,這種狀況通常是函數的約束定義不夠完善的緣由, 好比一個函數接受一個字符串參數的輸入,裏面對該字符串又沒有任何的修改,那麼該參數就應該定義成 const char*, 可是不少初學者弄不清const地用法,或者是懶, 總之就是隨意寫成了 char* 。 這樣子傳入CString時就須要強制的轉換一下。
這種作法是不安全的,也是不被建議的用法,你必須徹底明白、確認該字符串沒有被修改。
CString 轉換到 LPTSTR (char*), 預約的作法是調用CString的GetBuffer函數,使用完畢以後通常都要再調用ReleaseBuffer函數來確認修改 (某些狀況下也有不調用ReleaseBuffer的,一樣你須要很是明確爲何這麼作時才能這樣子處理,通常應用環境能夠不考慮這種狀況)。
同時須要注意的是, 在GetBuffer 和 ReleaseBuffer之間,CString分配了內存交由你來處理,所以不能再調用其餘的CString函數。編譯器

相關文章
相關標籤/搜索