C语言用char数据类型来表示一个8位ANSI字符,Microsoft的C/C++编译器定义了一个内建的数据类型wchar_t,它表示一个16位的Unicode(UTF-16)字符。
因为早期版本的Microsoft编译器没有提供这个内建的数据类型,所以编译器只有在指定了/Zc:wchar_t编译器开关时,才会定义这个数据类型。默认情况下,在VS中新建一个C++项目时,这个编译器开关是指定的。
在编译器内建对wchar_t的支持之前,有一个C头文件定义了一个wchar_t数据类型,如下所示:
typedef unsigned short wchar_t;
为了与C语言稍微有一些区分,Windows开发团队希望定义自己的数据类型。于是,他们在Windows头文件WinNT.h中定义了以下数据类型:
typedef char CHAR;
typedef wchar_t WCHAR;
除此之外,WinNT.h头文件还定义了一系列能为我们提供大量方便的数据类型,可以用它们来处理字符指针和字符串指针。根据是否定义了UNICODE宏,将TCHAR数据类型指定为WCHAR或CHAR类型。
总结:
TCHAR –> 定义了UNICODE宏 –> WCHAR –> wchar_t
TCHAR –> 未定义UNICODE宏 –> CHAR –> char
另:
C运行库针对不属于C++标准一部分的标识符,始终会为它们附加下划线前缀。因此,在C运行库使用UTF-16字符和字符串操作前,定义了_UNICODE宏。
但是,Windows团队并没有这么做。所以,在应用程序中,应确保要么同时定义了UNICODE和_UNICODE,要么一个都不要定义。默认情况下,在VS中新建一个C++项目时,这两个宏都是被定义了的。
