我接手了一些旧代码,需要保持多字节/Unicode兼容性。目前它使用_T()
宏来实现。我想知道如果引入std::string
,是否还需要_T()
?
例如:
std::string foo(_T("hello"));
还是现在已经过时了?
我接手了一些旧代码,需要保持多字节/Unicode兼容性。目前它使用_T()
宏来实现。我想知道如果引入std::string
,是否还需要_T()
?
例如:
std::string foo(_T("hello"));
UNICODE
,则_T
宏扩展为将字符串文字转换为宽字符(wchar_t
)字符串文字。然而,std::string
构造函数从不期望宽字符字符串(const wchar_t*
),而始终期望const char*
。std::basic_string
定义一个新类型。typedef std::basic_string<TCHAR> tstring;
tstring foo(_T("hello"));
_T
在这里完全没有帮助:如果_T
扩展为使用wchar_t
而不是char
,则代码将无法编译。
如果您需要保留TCHAR
,最好定义自己的tstring
类型,并始终使用它来代替std::string
:
typedef std::basic_string<TCHAR> tstring;
tstring foo(_T("Hello"));
记住,std::string
只是"char
"类型的"std::basic_string
"的别名。然后有std::wstring
,它是"wchar_t
"类型的"std::basic_string
"的别名。你需要的是"TCHAR
"类型的"std::basic_string
",因此要为其创建一个别名。
_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
宏。如果定义了UNICODE
,则需要重构代码,可能需要改用std::wstring
。
_T
被扩展为宽字符类型,那么这段代码不会编译通过,对吗? - EdChum