我试图定义一个这样的函数:
#ifdef _UNICODE
LPCTSTR A2T(const string& str);
#else
#define A2T
#endif
如果我的项目在Ansi,那么A2T(str)就是str。当我的项目在unicode A2T(str)时返回LPCTST类型
答案 0 :(得分:1)
定义UNICODE
后,LPCTSTR
是const wchar_t*
的别名,否则它是const char*
的别名。
您当前的宏为Unicode返回const wchar_t*
,但为Ansi返回std::string
。这没有意义。您无法在预期的A2T()
处始终使用LPCTSTR
。由于std::string
无法直接分配给char*
,因此代码甚至无法为Ansi编译。对于Unicode,代码会编译,但是你会有内存泄漏,因为从std:string
到wchar_t*
的转换需要动态内存分配,你必须最终释放。
更好的选择是让A2T()
为{}返回std::wstring
,为安西提供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)
的返回值传递给{{1}时},你可以使用LPCTSTR
)。
或者,您可能只是忘记编写自己的函数,只使用MFC / ATL中已有的现有A2T(str).c_str()
函数或A2CT()
类: