mfc下的常用字串資料型別表示的含義:
l:long
長 p:point 指標 c:const 常量 w:wchar_t 寬字元 t:tchar str:string 字串
在看看mfc下各種資料型別的定義:
1 typedef char *lpstr;2 typedef const
char *lpcstr;
34 typedef wchar_t *lpwstr;
5 typedef const wchar_t *lpcwstr;
6typedef wchar_t wchar;78
#ifdef unicode
9typedef lpcwstr lpctstr;
10typedef wchar tchar;
1112
#else
13typedef lpcstr lpctstr;
14 typedef char tchar;
mfc下提供的atl 轉換巨集:
t2a t2w t2ca t2cw w2a w2ca w2t w2ct a2w a2cw a2t a2ct
t:tchar 2:to c:const a:char(ansi) w:wchar
先到atlconv.h標頭檔案下看看這些巨集的定義,
1.uses_conversion:注意int _convert; (_convert);這種用法是為了遮蔽編譯器的警告:未引用的區域性變數。。。
#ifndef _debug#define uses_conversion int _convert; (_convert); uint _acp = atl::_atlgetconversionacp() /*cp_thread_acp*/; (_acp); lpcwstr _lpw; (_lpw); lpcstr _lpa; (_lpa)
#else
#define uses_conversion int _convert = 0; (_convert); uint _acp = atl::_atlgetconversionacp() /*cp_thread_acp*/; (_acp); lpcwstr _lpw = null; (_lpw); lpcstr _lpa = null; (_lpa)
#endif
可見,uses_conversion巨集定義了一些轉換所需要的變數,如_convert。所以使用那些巨集的時候必須加上該巨集。
2.a2w:這裡就用到了uses_conversion巨集定義的_convert變數
1#define a2w(lpa) (\
2 ((_lpa = lpa) == null) ?null : (\
3 _convert = (lstrlena(_lpa)+1
),\4 (int_max/2
<_convert)?null : \
5 atla2whelper((lpwstr) alloca(_convert*sizeof(wchar)), _lpa, _convert, _acp)))
3.atla2whelper
1#define atla2whelper atla2whelper
4.atla2whelper:實際上還是在呼叫multibytetowidechar,即多位元組轉換為寬位元組
1 _ret_opt_z_cap_(nchars) inline lpwstr winapi atla2whelper(_out_z_cap_(nchars) lpwstr lpw, _in_z_ lpcstr lpa, _in_ int nchars, _in_ uint acp) throw()214return
lpw;
15 }
5.alloca
#define alloca _alloca
6._alloca:該函式從堆上分配以位元組為單位的記憶體,返回void *
1void *_alloca(
2size_t size
3 );
使用方法舉例:
1 uses_conversion;//uses_conversion是atl中的乙個巨集定義,用於編碼轉換,它定義了轉換巨集所需的一些區域性變數23 wchar *pwch = l"
wchar* to char*";
4 char *pch =w2a(pwch);
56 tchar *ptch = _t("
tchar* to char*");
7 char *pch2 = t2a(ptch);
使用uses_conversion一定要小心,它們從堆疊上分配記憶體,直到呼叫它的函式返回,該記憶體不會被釋放。如果在乙個迴圈中,這個巨集被反覆呼叫幾萬次,將不可避免的產生stackoverflow。
但是考慮到棧空間的尺寸( 預設2m),使用時要注意幾點:
1、只適合於進行短字串的轉換;
2、不要試圖在乙個次數比較多的迴圈體內進行轉換;
3、不要試圖對字元型檔案內容進行轉換,因為檔案尺寸一般情況下是比較大的;
4、對情況 2 和 3,要使用 multibytetowidechar() 和 widechartomultibyte();
參見5、將字元轉換封裝到函式裡面
1void
doa2w()
2
除此之外,還可以使用c語言提供的函式:
1char * pstr = "
abc";2
3 size_t nlen = _mbstrlen(pstr) + 1;4
//也可以用mbstowcs(null, pstr, 0);,第乙個和第三個引數為空即得到非空字元的長度
56 wchar_t * pwstr = new
wchar_t[nlen];
7 mbstowcs(pwstr, pstr, nlen);//
multibyte string to widechar string
89 size_t nwlen = wcslen(pwstr) + 1;//
wcstombs(null, pwstr, 0)
10char *pstr2 = new
char
[nwlen];
11 wcstombs(pstr2, pwstr, nwlen);//
widechar string to multibyte string
1213
delete pwstr;
14 pwstr =null;
1516
delete pstr2;
17 pstr2 = null;
MFC下的各種字串型別和相互轉換
l long 長 p point 指標 c const 常量 w wchar t 寬字元 t tchar str string 字串 在看看mfc下各種資料型別的定義 1 typedef char lpstr 2 typedef const char lpcstr 34 typedef wchar ...
基本型別和字串型別之間的相互轉換
1 string型別轉基本型別 除了character外,所有基本型別包裝類,都提供了乙個par xx string s 和valueof string s 的靜態方法把特定字串轉化為基本型別變數。如 a0和a1都是整數123 2 基本型別轉string型別 string中有很多過載的valueof...
QString string和C字串相互轉換
std string轉換成qstring string std str abc qstring q str qstring fromstdstring std str qstring轉換成std string qstring q str abc string q str.tostdstring st...