我继承了一些需要保持多字节/ unicode兼容的旧代码。它目前使用_T()
宏。我想知道是否引入了std::string
,还需要_T()
吗?
例如
std::string foo(_T("hello"));
或现在是多余的?
答案 0 :(得分:5)
不仅不需要。这是错的。如果定义了_T
,wchar_t
宏将展开以将字符串文字转换为宽字符(UNICODE
)字符串文字。但是,std::string
构造函数从不期望宽字符串(const wchar_t*
)。它始终需要const char*
。
你可能会做什么,如果你仍然担心这种事情(编译WinAPI的Unicode和ANSI版本),则根据std::basic_string
typedef std::basic_string<TCHAR> tstring;
然后这是正确的:
tstring foo(_T("hello"));
答案 1 :(得分:3)
_T
根本没有帮助:如果_T
扩展为使用wchar_t
而不是char
,代码将无法编译。
如果您需要保持TCHAR
疯狂,最好定义自己的tstring
类型,并始终使用std::string
代替typedef std::basic_string<TCHAR> tstring;
tstring foo(_T("Hello"));
:
std::string
请注意,std::basic_string
只是char
的{{1}}的别名。“然后是std::wstring
,std::basic_string
的{{1}}别名。“您想要的是“wchar_t
s std::basic_string
”,因此请为其创建别名。
答案 2 :(得分:2)
_T
是一个VC ++宏,在未定义UNICODE
时扩展为空,在定义unicode时扩展为L
。
因此,如果未定义UNICODE
,则完全是多余的,如
std::string foo(_T("hello"));
变成
std::string foo("hello");
但定义了UNICODE
,表达式会扩展为
std::string foo(L"hello");
将无法编译,因为std::string
没有将const wchar_t*
作为参数的构造函数。
因此,如果未定义UNICODE
,您可以安全地删除_T
宏。如果已定义,则需要重构代码,可能转而使用std::wstring
。