_T宏是否会影响std :: string构造函数?

时间:2016-06-08 13:05:34

标签: c++ visual-c++

我继承了一些需要保持多字节/ unicode兼容的旧代码。它目前使用_T()宏。我想知道是否引入了std::string,还需要_T()吗?

例如

std::string foo(_T("hello"));

或现在是多余的?

3 个答案:

答案 0 :(得分:5)

不仅不需要。这是错的。如果定义了_Twchar_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::wstringstd::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