当我定义 UNICODE and/or _UNICODE 时,非 unicode API 函数会发生什么情况?

What happens to the non-unicode API functions when I define UNICODE and/or _UNICODE?

在 MS Visual Studio 中,当您不设置字符集时,AfxMessageBox()(以及无数其他 API 函数)将很乐意接受 CStringA争论。但是当您将字符集设置为 Unicode 时,看似完全相同的函数将只接受 CStringW 个参数。

现在这正是文档所说的应该发生的事情......但是...... 那些非 Unicode API 函数到底去了哪里?它们是否仍然存在以其他名称链接(可能是 AfxMessageBoxA()?)。通过什么魔法,一个 API 消失而另一个出现在它的位置上……或者……通过什么恶作剧的黑客技巧可以使它们重新出现?如果有可能使它们在 Unicode 存在的情况下重新出现,是否应该(明智地)使用这种黑客恶作剧?

afxwin.h中AfxMessageBox()的声明是:

   int AFXAPI AfxMessageBox(LPCTSTR lpszText, UINT nType = MB_OK,
                            UINT nIDHelp = 0);

适配字符串类型的是LPCTSTR。如果您使用有效的 UNICODE 进行编译,那么它是 const wchar_t* 的别名。没有它就是const char*。没有 AfxMessageBoxA() 版本。

这与 winapi 函数的工作方式有很大不同,必然如此,因为这是一个以不同方式处理的 C++ 函数。从技术上讲,他们本可以提供该功能的另一个重载,但他们没有。您还会有不同的 link 需求,您需要 link MFC 库的非 Unicode 版本以使 link 用户满意。值得注意的是它已被弃用并且不再随最近的 VS 版本一起提供,但仍然可以(现在)作为单独的下载。

这应该可以回答您的问题,它不会去任何地方,它根本不存在。混合不起作用,您需要 A2W() 来转换字符串。如果需要,您当然可以简单地编写自己的重载。