TCHAR,WCHAR,LPSTR,LPWSTR和LPCTSTR,这几个看起来差不多,也很容易混淆,他们都是跟字符有密切关系的。要想知道他们的由来以及作用就必须先了解字符的编码。
0.字符编码
在操作系统里面一般使用两种编码:ansi和unicode。我们在用记事本另存为一个文件的时候可以看到这两种编码,还有其他的比如UTF-8、UTF-16和GB2312都是他们的扩展。c/c++当然也支持这两种字符编码,ansi字符用char(1字节)表示,unicode用wchart_t(2字节)表示。用""包围的是ansi字符串,前面加个L,也就是用L""包围的就是unicode字符串。比如:"ansi string";//ansi字符串
L"unicode string";//unicode字符串
有了这些知识下面的就好说了。
1.TCHAR
TCHAR其实不是数据类型,他只是c++的一个类型别名。因为ansi字符和unicode字符的长度是不一样的,ansi是1字节的,而unicode用两字节表示,但我们在写程序的时候是不知道这个程序会被用到那个字符编码的,所以在c/c++中有一个宏_UNICODE用来标识当前的字符编码。当_UNICODE被定义时,使用unicode编码,未定义使用ansi编码。再回到TCHAR,先看看他的定义:
#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
2.WCHAR
WCHAR就是wchar_t,还有一个CHAR就是char,应该是为了写法上好看吧。3.LPSTR,LPWSTR和LPCTSTR
他们都是单词的缩写,我们可以这样来理解:- L - Long(长)
- P - Pointer(指针,也就是数组)
- C - Constant(常量)
- W - Wide(宽,也就是WCHAR的意思)
- T - TCHAR(上面说过了)
- STR - String(字符串)
- LPSTR=指向字符串的长指针=char