当我们编写支持unicode和multibytes的程序时,
我们经常使用_T(“some string”)宏来表示字符串。
但是,角色是否还需要包装此宏?
L'A'和'A'完全相同吗? 我们不需要为一个角色包裹_T('A')吗?
答案 0 :(得分:5)
不,L'A'是类型为wchar_t
的unicode字符,而'A'是类型为char
的ASCII字符。这是字符串文字的MSDN。
答案 1 :(得分:3)
如果您编写'A'
,并且该值转换为wchar_t
,那么至少在Microsoft编译器上,它将具有与您编写L'A'
或{相同的值{1}}。
对于字符串文字也不能这样说,因为没有从_T('A')
到const char*
的有用转换。我认为这意味着让字符文字类型正确,而不是字符串文字。
根据字符文字是宽还是窄来编写行为不同的代码很容易 - 只需要一个完全不同的重载函数。但是在实践中,重载的合理函数可以使两种类型的角色最终与const wchar_t*
使用'A'
做同样的事情。并且只有L'A'
才能使用wchar_t
并且没有超载的功能。
我没有立即在标准中看到要求'A'
的任何内容,因此理论上非Microsoft编译器可能会做一些完全不同的事情。但是你通常希望宽字符集是窄字符集的扩展,就像Unicode扩展ISO-8859-1一样。具体来说,“扩展”的含义是,与整数相等的代码点表示“相同的字符”。
答案 2 :(得分:1)
L'A'是 wchar_t ,'A'是 char 。它们是不同的类型,也有不同的大小。
如果定义了_UNICODE宏,则应使用_T('A')将L添加到文字中。
答案 3 :(得分:0)
_T是来自Visual Studio的宏,如果在你的项目的属性中字符集属性设置为'使用多字节字符'_T将被替换为空字符串,如果它将被设置为'使用Unicode字符集'_T将是换成L. 此宏定义为从Unicode-> ASCII字符集简单转换项目而无需任何其他更改