我一直在查看Visual Studio生成的命令行,对于我的一个项目,它定义了两个符号:_UNICODE
和UNICODE
。现在,如果我理解了这个文档this rather old 文档,那么_UNICODE
符号就是一个VC ++,会导致某些标准函数在其接口中使用wchar_t
而不是char
。
但是没有下划线的UNICODE
是什么意思?
答案 0 :(得分:47)
Raymond Chen在此解释:TEXT vs. _TEXT vs. _T, and UNICODE vs. _UNICODE:
没有下划线的普通版本会影响Windows头文件视为默认的字符集。因此,如果您定义
UNICODE
,则GetWindowText
将映射到GetWindowTextW
,而不是GetWindowTextA
。同样,TEXT
宏将映射到L"..."
而不是"..."
。带有下划线的版本会影响C运行时头文件视为默认值的字符集。因此,如果您定义
_UNICODE
,则_tcslen
将映射到wcslen
,而不是strlen
。同样,_TEXT
宏将映射到L"..."
而不是"..."
。
查看Windows SDK,您会发现以下内容:
#ifdef _UNICODE
#ifndef UNICODE
#define UNICODE
#endif
#endif
答案 1 :(得分:14)
编译器供应商必须在其头文件中使用下划线标识前缀,以防止它们与您的标识符冲突。所以编译器头文件<tchar.h>
使用_UNICODE。 Windows SDK头文件与编译器无关,而且很老,它使用UNICODE而没有下划线。你必须定义两者。
答案 2 :(得分:11)
简而言之,
Windows标头使用 UNICODE
,而
_UNICODE
由C-runtime / MFC头使用。