VC++里面定义字符串的时候,用_T
来保证兼容性。VC++支持ANSI和UNICODE两种字符类型(这两种字符集的转换可通过项目->属性->常规->字符集:使用UNICODE字符集和使用多字节字符集选项来改变。VC6以前的版本,需要手动更改:工程->设置->预处理程序定义。将_MBCS 改为_UNICODE),用_T可以保证源代码从ASCI i编码类型转换到UNICODE编码类型的时候,程序不需要修改。
例如:_T("ABC"),在ANSI的环境下,它自动解释为ANSI编码,如果转换到UNICODE下,那么它将自动解释为双字节字符串,既UNICODE编码。这样做的好处,不管是ANSI环境,还是UNICODE环境,都适用。
那么在VC++中,字符串_T("ABC")和一个普通的字符串"ABC"有什么区别呢?
如果程序采用的是UNICODE编码,它将自动转换为 L"ABC",每个字符为16位,宽字符串。
L的用法:
如 L"ABC" 表示将ANSI字符串转换成UNICODE的字符串,就是每个字符占用两个字节。
strlen("ABC") = 3;
strlen(L"ABC") = 6;
如果采用ASCI 编码,它就是ASCI 的"ABC",每个字符为8位。
可以理解为以下代码:
#ifdef _UNICODE
#define _T("ABC") L"ABC"
#else
#define _T("ABC") "ABC"
#endif
_T
宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目标环境选择合适的(UNICODE还是ANSI)字符处理方式。另外宏 TEXT
、_TEXT
和 _T
一样的。
TCHAR 类型正如名称一样,它通过T和CHAR类型的组合来定义一个字符类型的变量,无论采用何种形式的编码规范。它都将自动处理转换。我们可以这样定义一个变量:TCHAR a[] = _T("ABC")
; 当为UNICODE编码时相当于 WCHAR a[] = L"ABC"
,当为ANSI编码时解释为 char a[] = "ABC"
;
LPTSTR 相当于 *TCHAR
,也是自动转换编码规范。
在程序设计中,应当尽量使用这样的红去定义变量,可以保证程序的兼容性和移植性!