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

3

我接手了一些旧代码,需要保持多字节/Unicode兼容性。目前它使用_T()宏来实现。我想知道如果引入std::string,是否还需要_T()

例如:

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

还是现在已经过时了?

3
如果_T被扩展为宽字符类型,那么这段代码不会编译通过,对吗? - EdChum
这取决于你的项目是如何编译的,是否启用了UNICODE模式。 - πάντα ῥεῖ
3个回答

5
这不仅是多余的,而且是错误的。如果定义了UNICODE,则_T宏扩展为将字符串文字转换为宽字符(wchar_t)字符串文字。然而,std::string构造函数从不期望宽字符字符串(const wchar_t*),而始终期望const char*
如果您仍然关心这种事情(同时编译WinAPI的Unicode和ANSI版本),可以基于std::basic_string定义一个新类型。
typedef std::basic_string<TCHAR> tstring;

然后这样是正确的:
tstring foo(_T("hello"));

3

_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",因此要为其创建一个别名。


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宏。如果定义了UNICODE,则需要重构代码,可能需要改用std::wstring


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接