- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试定义这样的函数:
#ifdef _UNICODE
LPCTSTR A2T(const string& str);
#else
#define A2T
#endif
如果我的项目是在 Ansi 中,那么 A2T(str) 就是 str 本身。当我的项目是 unicode A2T(str) 时返回一个 LPCTST 类型
最佳答案
当定义了UNICODE
时,LPCTSTR
是const wchar_t*
的别名,否则是const char*的别名
。
您当前的宏为 Unicode 返回 const wchar_t*
,但为 Ansi 返回 std::string
。那没有意义。您将无法在所有需要 LPCTSTR
的地方始终如一地使用 A2T()
。由于 std::string
不能直接分配给 char*
,因此代码甚至无法针对 Ansi 进行编译。对于 Unicode,代码可以编译,但是您会遇到内存泄漏,因为从 std:string
到 wchar_t*
的转换需要动态内存分配,您最终必须释放该内存.
更好的选择是让 A2T()
为 Unicode 返回 std::wstring
,为 Ansi 返回 std::string
:
#ifdef UNICODE
std::wstring A2T(const string& str)
{
std::wstring result;
// do the conversion from Ansi to Unicode as needed...
// MultiByteToWideChar(), std::wstring_convert, etc...
return result;
}
#else
std::string A2T(const string& str)
{
return str;
}
#endif
或者:
std::basic_string<TCHAR> A2T(const string& str)
{
#ifdef UNICODE
std::wstring result;
// do the conversion from Ansi to Unicode as needed...
// MultiByteToWideChar(), std::wstring_convert, etc...
return result;
#else
return str;
#endif
}
无论哪种方式,您都可以在转换后获得所需的自动内存管理,并且可以在 Ansi 和 Unicode 中一致地使用 A2T()
(当传递 A2T(str )
到 LPCTSTR
,您可以使用 A2T(str).c_str()
)。
或者,您可以简单地忘记编写自己的函数,而只使用现有的 A2CT()
函数或 MFC/ATL 中已有的 CA2CT
类:
关于c++ - 如何将字符串转换为 unicode 中的 wchar*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38799877/
我是一名优秀的程序员,十分优秀!