我试着定义一个这样的函数:
#ifdef _UNICODE LPCTSTR A2T(const string& str); #else #define A2T #endif
如果我的项目是在Ansi中,那么A2T(str)就是str本身。当我的项目是在unicode中时,A2T(str)返回LPCTST类型
at0kjp5o1#
当定义了UNICODE时,LPCTSTR是const wchar_t*的别名,否则是const char*的别名。您当前的宏返回const wchar_t*(Unicode),但返回std::string(Ansi)。这是没有意义的。您将无法在需要LPCTSTR的任何地方始终使用A2T()。代码甚至不会编译为Ansi,因为std::string不能直接分配给char*。对于Unicode,代码将编译为但是你会有内存泄漏,因为从std:string到wchar_t*的转换需要动态的内存分配,你最终必须释放它。一个更好的选择是让A2T()返回std::wstring(对于Unicode)和std::string(对于Ansi):
UNICODE
LPCTSTR
const wchar_t*
const char*
std::string
A2T()
char*
std:string
wchar_t*
std::wstring
#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())。或者,您可以直接忘记编写自己的函数,而只是使用MFC/ATL中已有的A2CT()函数或CA2CT类:ATL and MFC String Conversion Macros
A2T(str)
A2T(str).c_str()
A2CT()
CA2CT
1条答案
按热度按时间at0kjp5o1#
当定义了
UNICODE
时,LPCTSTR
是const wchar_t*
的别名,否则是const char*
的别名。您当前的宏返回
const wchar_t*
(Unicode),但返回std::string
(Ansi)。这是没有意义的。您将无法在需要LPCTSTR
的任何地方始终使用A2T()
。代码甚至不会编译为Ansi,因为std::string
不能直接分配给char*
。对于Unicode,代码将编译为但是你会有内存泄漏,因为从std:string
到wchar_t*
的转换需要动态的内存分配,你最终必须释放它。一个更好的选择是让
A2T()
返回std::wstring
(对于Unicode)和std::string
(对于Ansi):或者:
无论哪种方式,您都可以在转换后获得所需的自动内存管理,并且可以在Ansi和Unicode中一致地使用
A2T()
(当将A2T(str)
的返回值传递给LPCTSTR
时,您可以使用A2T(str).c_str()
)。或者,您可以直接忘记编写自己的函数,而只是使用MFC/ATL中已有的
A2CT()
函数或CA2CT
类:ATL and MFC String Conversion Macros