TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR<二>

TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR究竟是神马<二>!!!


大家都知道,我们使用双引号来表示字符串。这种方式表示的字符串称为ANSI字符串,每个字符占用一个字节。例如:
"This is ANSI String. Each letter takes 1 byte."
以上的字符串文本不是Unicode字符集的,是多语言支持的。为了表示Unicode字符串,需要使用前缀L,例如:
L"This is Unicode string. Each letter would take 2 bytes, including spaces."
注意L在字符串开头处,它就成了Unicode字符串。其中的每一个字符都占用两个字节,包括英文单词、空格、数字和空结束符。因此,Unicode字符串的长度都是2字节的整数倍。具有7个字符的Unicode字符串需要14字节。如果说有占用15字节的Unicode字符串,那是不可能的。

一般来说,字符串是sizeof(TCHAR)的倍数。
当你需要表示硬编码字符串时,你可以这样用:
"ANSI String"; // ANSI
L"Unicode String"; // Unicode

_T("Either string, depending on compilation"); // ANSI or Unicode
没有预处理的字符串是ANSI字符串,有L开头的字符串是Unicode字符串,而使用_T或者TEXT处理过的字符串按照具体情况可能是其中的某一种,依赖于具体编译器。注意,_T和TEXT仅仅是宏而已,它们是这样定义的:
#ifdef _UNICODE 
 #define _T(c) L##c
 #define TEXT(c) L##c
#else 
 #define _T(c) c
 #define TEXT(c) c
#endif

标识符 ## 是链接操作符,它会将_T("Unicode")转换成L"Unicode",传送的字符串代替了参数宏的位置——如果_UNICODE已定义。如果_UNICODE未定义,_T("Unicode")则就是"Unicode"。

注意,这些宏不仅仅只能作用于字符串,也可以作用于字符。_T('R')将被转换成L'R'或者'R'——前者是Unicode编码,后者是ANSI字符。

但是你不能用这些宏来转换变量(字符或字符串变量)。下面的写法是错误的:
char c = 'C';
char str[16] = "CodeProject";

_T(c);
_T(str);
_T(c)和_T(str)能在多字节字符编码的情况下成功编译,因为_T(x)就是x,因此_T(c)和_T(str)转换结果就是c和str。但是当你设置成Unicode字符集时,就会编译出错:
error C2065: 'Lc' : undeclared identifier
error C2065: 'Lstr' : undeclared identifier
其原因十分明了。

需要注意的是,主要是在Windows API中,几乎所有函数,把字符串(或字符)原型定义在MSDN和其他地方。例如 SetWindowTextA/W
BOOL SetWindowText(HWND, const TCHAR*);
但是你知道, SetWindowText仅仅是一个宏,根据你的编译设置,它可能是如下情况:
BOOL SetWindowTextA(HWND, const char*);
BOOL SetWindowTextW(HWND, const wchar_t*);
因此,如果调用失败后得到该函数的地址时不要觉得奇怪:
HMODULE hDLLHandle;
FARPROC pFuncPtr;

hDLLHandle = LoadLibrary(L"user32.dll");

pFuncPtr = GetProcAddress(hDLLHandle, "SetWindowText");
//pFuncPtr将null,因为不存在任何SetWindowText函数名称

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值