LPCTSTR和CString的關係

2021-06-06 09:27:12 字數 2233 閱讀 5369

型別理解

lpctstr型別:

l表示long指標 這是為了相容windows 3.1等16位作業系統遺留下來的,在win32中以及其他的32位作業系統中, long指標和near指標及far修飾符都是為了相容的作用。沒有實際意義。

p表示這是乙個指標

c表示是乙個常量

t表示在win32環境中, 有乙個_t巨集

str表示這個變數是乙個字串

詳細釋義

這個巨集用來表示你的字元是否使用unicode, 如果你的程式定義了unicode或者其他相關的巨集,那麼這個字元或者字串將被作為unicode字串,否則就是標準的ansi字串。

所以lpctstr就表示乙個指向常固定位址的可以根據一些巨集定義改變語義的字串。

在程式中我們大部分時間要使用帶t的型別定義。

lpctstr == const tchar *

cstring 和 lpctstr 可以說通用。 原因在於cstring定義的自動型別轉換,沒什麼奇特的,最簡單的c++操作符過載而已。

常量字串ansi和unicode的區分是由巨集_t來決定的。但是用_t("abcd")時, 字串"abcd"就會根據編譯時的是否定一_unicode來決定是char* 還是 w_char*。 同樣,tchar 也是相同目的字元巨集。 看看定義就明白了。

簡單起見,下面只介紹 ansi 的情況,unicode 可以類推。

ansi情況下,lpctstr 就是 const char*, 是常量字串(不能修改的)。

而lptstr 就是 char*, 即普通字串(非常量,可修改的)。

這兩種都是基本型別, 而cstring 是 c++類, 相容這兩種基本型別是最起碼的任務了。

由於const char* 最簡單(常量,不涉及記憶體變更,操作迅速), cstring 直接定義了乙個型別轉換函式:

operator lpctstr( )

函式直接返回所維護的字串。

當你需要乙個const char* 而傳入了cstring時, c++編譯器自動呼叫 cstring過載的操作符 lpctstr()來進行隱式的型別轉換。

當需要cstring , 而傳入了 const char* 時(其實 char* 也可以),c++編譯器則自動呼叫cstring的建構函式來構造臨時的 cstring物件。

因此cstring 和 lpctstr 基本可以通用。

但是 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函式。

cstring 轉lpctstr:

cstring cstr;

const char *lpctstr=(lpctstr)cstr;

lpctstr轉cstring:

lpctstr lpctstr;

cstring cstr=lpctstr;

**:

LPCTSTR和CString的關係

型別理解 lpctstr型別 l表示long指標 這是為了相容windows 3.1等16位作業系統遺留下來的,在win32中以及其他的32位作業系統中,long指標和near指標及far修飾符都是為了相容的作用。沒有實際意義。p表示這是乙個指標 c表示是乙個常量 t表示在win32環境中,有乙個 ...

LPCTSTR和CString的關係

型別理解 lpctstr型別 l表示long指標 這是為了相容windows 3.1等16位作業系統遺留下來的,在win32中以及其他的32位作業系統中,long指標和near指標及far修飾符都是為了相容的作用。沒有實際意義。p表示這是乙個指標 c表示是乙個常量 t表示在win32環境中,有乙個 ...

LPCTSTR運算子 CString使用注意

cstring類功能強大,比stl的string類有過之無不及.新手使用cstring時,都會被它強大 的功能所吸引.然而由於對它內部機制的不了解,新手在將cstring向c的字元陣列轉換時 容易出現很多問題.因為cstring已經過載了lpctstr運算子,所以cstring類向const cha...