c++ - 当我定义 UNICODE 和/或 _UNICODE 时,非 unicode API 函数会发生什么情况?

标签 c++ visual-studio unicode

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

现在这正是文档所说的应该发生的......但是...... 那些非 Unicode API 函数到底去了哪里?它们是否仍然以其他名称链接到(AfxMessageBoxA() 可能?)。通过什么魔法,一个 API 消失而另一个 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++ 函数。从技术上讲,他们本可以提供该功能的另一个重载,但他们没有。您还会有不同的链接需求,您需要链接 MFC 库的非 Unicode 版本以使链接器满意。值得注意的是它已被弃用并且不再随最近的 VS 版本一起提供,但仍然可以(现在)作为单独的下载。

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

关于c++ - 当我定义 UNICODE 和/或 _UNICODE 时,非 unicode API 函数会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29189683/

相关文章:

c++ - 为什么 new 不需要转换为指针,即使 malloc 需要它?

visual-studio - 从Visual Studio选项卡中删除 "Not Connected"后缀

python - Python 中的 unicode 类

java - 使用 Android 进行音译

c++ - 质数保理,无 IO

c++ - 请求非类类型的成员

visual-studio - 找不到引用的组件 'System'。 (或与此相关的任何其他组件)

stored-procedures - Oracle 存储过程中的 Unicode

c++ - vector 复制构造函数 C++ : does it have to be linear time?

python - 如何在 Visual Studio 2008 的 Python 中使用制表符作为空格?