size_t,__T,_T,TEXT,_TEXT等一些特殊宏的理解

来源:互联网 发布:卖家淘宝试用中心 编辑:程序博客网 时间:2024/05/17 08:15

typedef char TCHAR ;   
现在开始讨论字符串文字中的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__Tx   
#define _TEXT
x__Tx   
Win32 console程序中使用哪个宏,取决于您喜欢简洁还是详细。基本地,必须按下述方法在_T_TEXT宏内定义字符串文字:

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

宽字符和 Windows


Windows NT
从底层支援Unicode。这意味着Windows NT内部使用由16位字符组成的字符串。因为世界上其它许多地方还不使用16位字符串,所以Windows NT必须经常将字符串在操作系统内转换。Windows NT可执行为ASCIIUnicode或者ASCIIUnicode混合编写的程序。即,Windows NT支持不同的API函数呼叫,这些函数接受8位或16位的字符串(我们将马上看到这是如何动作的。)

相对于Windows NTWindows 98Unicode的支持要少得多。只有很少的Windows 98函数呼叫支持宽字符串(这些函数列在《Microsoft Knowledge Base article Q125671》中;它们包括MessageBox)。如果要发行的程序中只有一个.EXE文件要求在Windows NTWindows 98下都能执行,那么就不应该使用Unicode,否则就不能在Windows 98下执行;尤其程序不能呼叫Unicode版的Windows函数。这样,将来发行Unicode版的程序时会处于更有利的位置,您应试着编写既为 ASCII又为Unicode编译的原始码。这就是本书中所有程序的编写方式。

Windows
表头文件类型


正如您在第一章所看到的那样,一个Windows程序包括表头文件WINDOWS.H。该文件包括许多其它表头文件,包括 WINDEF.H,该文件中有许多在Windows中使用的基本型态定义,而且它本身也包括WINNT.HWINNT.H处理基本的Unicode 持。

WINNT.H
的前面包含C的表头文件CTYPE.H,这是C的众多表头文件之一,包括wchar_t的定义。WINNT.H定义了新的数据型态,称作CHARWCHAR

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

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

typedef CHAR * PCHAR, * LPCH, * PCH, * NPSTR, * LPSTR, * PSTR ;   
typedef CONST CHAR * LPCCH, * PCCH, * LPCSTR, * PCSTR ;   
前缀NL表示「near」和「long」,指的是16Windows中两种大小不同的指标。在Win32nearlong指标没有区别。

类似地,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),以及指向CHARWCHAR的指标。与 TCHAR.H一样,WINNT.HTCHAR定义为一般的字符类型。如果定义了标识符UNICODE(没有底线),则TCHAR和指向TCHAR的指 标就分别定义为WCHAR和指向WCHAR的指标;如果没有定义标识符UNICODE,则TCHAR和指向TCHAR的指标就分别定义为char和指向 char的指标:

#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.HWCHAR.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宏的方法一样,只是不必操心底线。我将在本书中使用这个宏的TEXT版本。

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

原创粉丝点击