char wchar_t TCHAR
TCHAR的定义:
#ifdef _UNICODE
typedef wchar_t TCHAR
#else
typedef char TCHAR
#endif
char * const char* wchar_t* const wchar*
LPSTR LPCSTR LPWSTR LPCWSTR LPTSTR LPCTSTR
LP,表示long point;C,表示const;T,表示TCHAR;至于STR,字面上应该等价于charLPTSTR的定义:
#ifdef _UNICODE
typedef wchar_t* LPTSTR
#else
typedef char* LPTSTR
#endif
string、CString、char*1. char*能直接转为string和CString,赋值或构造。
string 不管是在unicode还是多字节字符集下,都是单字节,数字、字母占一个字节,汉字占2个字节。如果想用宽字符,用std::wstring,也就是UNICODE_string。
在UNICODE下,CString采用wchar_t,用char*直接赋值、构造,或者用CA2T,CString都会调用一个隐式转换MultiByteToWideChar。但是,不能用CString::Format转换char*,因为会将char*的两个char转为一个wchar_t。
参考文章:
http://www.cnblogs.com/eNigMAronG/articles/1588806.html
strlen不算结尾符“\0”
sizeof算的是所占空间大小,会算上结尾符"\0"
CString::GetBuffer 与CString::ReleaseBuffer
LPTSTR CString::GetBuffer(int nMinBufLength);
GetBuffer的返回值为LPTSTR。当调用GetBuffer并改变CString内容后,一定要调用ReleaseBuffer,这样,CString的大小属性才会改变。
参考文章:
http://blog.sina.com.cn/s/blog_4b3c1f950100ksy2.html
UNICODE意识
LPTSTR ptch = _T("Unicode consciousness");
CString cstr = _T("Unicode consciousness");
strcpy与memcpy
复制的内容不同,strcpy只能复制字符串;而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
复制的方法不同,strcpy不需要指定长度,它遇到字符串结束符"\0"便结束,但有strncpy需要指定长度;memcpy则是根据其第3个参数决定复制的长度。
实现strcpy
char *strDestCopy = strDest; //保存目标字符串的首地址
while ((*strDestCopy ++ = *strSrc++)!='\0'); //把 strSrc字符串的内容复制到strDest下
return strDest; //返回首地址
实现memcpy
char *DestCopy = (char *)anyDest; //保存首地址
while(size-- > 0) //循环size次,size为传进来的大小,注意自减运算符"--"
*DestCopy ++ = *anySrc++ ;
return anyDest;
参考文章:
http://apps.hi.baidu.com/share/detail/31972786
L、_T()、TEXT()
#ifdef UNICODE
#define TEXT(s) L##s
#else
#define TEXT(s) s
#endif
-------------------------
#ifdef UNICODE
#define _T(s) L##s
#else
#define _T(s) s
#endif
注:## 是宏定义使用的拼接符
typedef与#define
#define只是简单的字符串替换而typedef则是为一个类型起新名字。
参考文章:
http://www.cnblogs.com/csyisong/archive/2009/01/09/1372363.html
#pragma once 与 #ifndef #define #endif
#pragma once用来防止某个头文件被多次include。#pragma once是编译相关,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个编译器都有这个定义了。
#ifndef,#define,#endif用来防止某个宏被多次定义。#ifndef,#define,#endif这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式。