为什么需要同时使用UNICODE和_UNICODE?

52
我一直在查看Visual Studio生成的命令行,对于我的一个项目,它定义了两个符号:_UNICODEUNICODE。现在,如果我理解这篇相当旧的文件,_UNICODE符号是VC++的东西,它导致某些标准函数在其接口中使用wchar_t而不是char
但是没有下划线的UNICODE代表什么意思?

当UNICODE被定义时,可以使用CreateWindowW等函数而不是CreateWindowA,因此UNICODE用于WinApi,_UNICODE用于C运行时库。 - Blablablaster
3个回答

70
雷蒙德·陈在这里解释了:TEXT vs. _TEXT vs. _T, and UNICODE vs. _UNICODE(英文原文链接: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
正确的链接是:https://devblogs.microsoft.com/oldnewthing/20040212-00/?p=40643,旧的已经失效(感谢微软)...此外,“建议编辑队列已满”,这就是为什么我要写评论的原因。 - mrBen

31
简而言之, Windows头文件使用UNICODE, 而C运行时/MFC头文件使用_UNICODE

22
编译器厂商必须在其头文件中给标识符添加下划线前缀,以防止它们与您的标识符冲突。因此,编译器头文件<tchar.h>使用_UNICODE。而Windows SDK头文件是编译器无关的,非常老旧,使用带有下划线的UNICODE。您需要定义两者。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接