当我定义 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() 来转换字符串。如果需要,您当然可以简单地编写自己的重载。
在 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() 来转换字符串。如果需要,您当然可以简单地编写自己的重载。