CHAR,WCHAR,_T,_TEXT等等之间的千丝万缕

首先讨论字符串文字中的L问题。如果定义了_UNICODE识别字,那么一个称作__T的宏就定义如下:

 
 
#define  __T(x) L##x

这是相当晦涩的语法,但合乎ANSI C标准的前置处理器规范。那一对井字号称为「粘贴符号(token paste)」,它将字母L添加到宏参数上。因此,如果宏参数是"Hello!",则L##x就是L"Hello!"。

如果没有定义_UNICODE识别字,则__T宏只简单地定义如下:

 
 
#define  __T(x) x

此外,还有两个宏与__T定义相同:

 
 
#define  _T(x) __T(x)
#define  _TEXT(x) __T(x)
在Win32 console程序中使用哪个宏,取决于您喜欢简洁还是详细。基本地,必须按下述方法在_T或_TEXT宏内定义字符串文字:
 
 
_TEXT ( " Hello! " )

这样做的话,如果定义了_UNICODE,那么该串将解释为宽字符的组合,否则解释为8位的字符字符串。

WINNT.H的前面包含C的表头文件CTYPE.H,这是C的众多表头文件之一,包括wchar_t的定义。WINNT.H定义了新的资料型态,称作CHAR和WCHAR:

 
 
typedef  char  CHAR ;
typedef wchar_t WCHAR ;    
//  wc
当您需要定义8位字符或者16位字符时,推荐您在Windows程序中使用的资料型态是CHAR和WCHAR。WCHAR定义后面的注释是匈牙利标记法的建议:一个基于WCHAR资料型态的变数可在前面附加上字母wc以说明一个宽字符。

WINNT.H表头文件进而定义了可用做8位字符串指针的六种资料型态和四个可用做const 8位字符串指针的资料型态。这里精选了表头文件中一些实用的说明资料型态语句:

 
 
typedef CHAR  *  PCHAR,  *  LPCH,  *  PCH,  *  NPSTR,  *  LPSTR,  *  PSTR ;
typedef CONST CHAR 
*  LPCCH,  *  PCCH,  *  LPCSTR,  *  PCSTR ;
字首N和L表示「near」和「long」,指的是16位Windows中两种大小不同的指针。在Win32中near和long指针没有区别。

类似地,WINNT.H定义了六种可作为16位字符串指针的资料型态和四种可作为const 16位字符串指针的资料型态:

 
 
typedef WCHAR  *  PWCHAR,  *  LPWCH,  *  PWCH,  *  NWPSTR,  *  LPWSTR,  *  PWSTR ;
typedef CONST WCHAR 
*  LPCWCH,  *  PCWCH,  *  LPCWSTR,  *  PCWSTR ;
至此,我们有了资料型态CHAR(一个8位的char)和WCHAR(一个16位的wchar_t),以及指向CHAR和WCHAR的指针。与TCHAR.H一样,WINNT.H将TCHAR定义为一般的字符类型。如果定义了识别字UNICODE(没有底线),则TCHAR和指向TCHAR的指针就分别定义为WCHAR和指向WCHAR的指针;如果没有定义识别字UNICODE,则TCHAR和指向TCHAR的指针就分别定义为char和指向char的指针:
 
 
ContractedBlock.gif ExpandedBlockStart.gif Code
#ifdef  UNICODE                   
typedef WCHAR TCHAR, 
* PTCHAR ;
typedef LPWSTR LPTCH, PTCH, PTSTR, LPTSTR ;
typedef LPCWSTR LPCTSTR ;
#else 
typedef 
char TCHAR, * PTCHAR ;
typedef LPSTR LPTCH, PTCH, PTSTR, LPTSTR ;
typedef LPCSTR LPCTSTR ;
#endif
如果已经在某个表头文件或者其它表头文件中定义了TCHAR资料型态,那么WINNT.H和WCHAR.H表头文件都能防止其重复定义。不过,无论何时在程序中使用其它表头文件时,都应在所有其它表头文件之前包含WINDOWS.H。

WINNT.H表头文件还定义了一个宏,该宏将L添加到字符串的第一个引号前。如果定义了UNICODE识别字,则一个称作 __TEXT的宏定义如下:

 
 
#define  __TEXT(quote) L##quote

如果没有定义识别字UNICODE,则像这样定义__TEXT宏:

 
 
#define  __TEXT(quote) quote

此外, TEXT宏可这样定义:

 
 
#define  TEXT(quote) __TEXT(quote)

这与TCHAR.H中定义_TEXT宏的方法一样,只是不必操心底线。

这些定义可使您在同一程序中混合使用ASCII和Unicode字符串,或者编写一个可被ASCII或Unicode编译的程序。如果您希望明确定义8位字符变数和字符串,请使用CHAR、PCHAR(或者其它),以及带引号的字符串。为明确地使用16位字符变数和字符串,请使用WCHAR、PWCHAR,并将L添加到引号前面。对于是8位还是16位取决于UNICODE识别字的定义的变数或字符串,要使用TCHAR、PTCHAR和TEXT宏。

转载于:https://www.cnblogs.com/wanghao111/archive/2009/05/26/1489450.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值