首先讨论字符串文字中的L问题。如果定义了_UNICODE识别字,那么一个称作__T的宏就定义如下:
这是相当晦涩的语法,但合乎ANSI C标准的前置处理器规范。那一对井字号称为「粘贴符号(token paste)」,它将字母L添加到宏参数上。因此,如果宏参数是"Hello!",则L##x就是L"Hello!"。
如果没有定义_UNICODE识别字,则__T宏只简单地定义如下:
此外,还有两个宏与__T定义相同:
#define _TEXT(x) __T(x)
这样做的话,如果定义了_UNICODE,那么该串将解释为宽字符的组合,否则解释为8位的字符字符串。
WINNT.H的前面包含C的表头文件CTYPE.H,这是C的众多表头文件之一,包括wchar_t的定义。WINNT.H定义了新的资料型态,称作CHAR和WCHAR:
typedef wchar_t WCHAR ; // wc
WINNT.H表头文件进而定义了可用做8位字符串指针的六种资料型态和四个可用做const 8位字符串指针的资料型态。这里精选了表头文件中一些实用的说明资料型态语句:
typedef CONST CHAR * LPCCH, * PCCH, * LPCSTR, * PCSTR ;
类似地,WINNT.H定义了六种可作为16位字符串指针的资料型态和四种可作为const 16位字符串指针的资料型态:
typedef CONST WCHAR * LPCWCH, * PCWCH, * LPCWSTR, * PCWSTR ;
#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
WINNT.H表头文件还定义了一个宏,该宏将L添加到字符串的第一个引号前。如果定义了UNICODE识别字,则一个称作 __TEXT的宏定义如下:
如果没有定义识别字UNICODE,则像这样定义__TEXT宏:
此外, TEXT宏可这样定义:
这与TCHAR.H中定义_TEXT宏的方法一样,只是不必操心底线。
这些定义可使您在同一程序中混合使用ASCII和Unicode字符串,或者编写一个可被ASCII或Unicode编译的程序。如果您希望明确定义8位字符变数和字符串,请使用CHAR、PCHAR(或者其它),以及带引号的字符串。为明确地使用16位字符变数和字符串,请使用WCHAR、PWCHAR,并将L添加到引号前面。对于是8位还是16位取决于UNICODE识别字的定义的变数或字符串,要使用TCHAR、PTCHAR和TEXT宏。