L“以下:”和“以下内容”之间有什么区别:

时间:2016-02-09 04:34:44

标签: c++ unicode

两者之间有什么不同吗?两者都与vs2013编译。

CStringW str1 =“以下内容:”; CString str2 = L“以下:”;

字符串来自afxstr:https://msdn.microsoft.com/en-us/library/ms174288.aspx

我知道没有L的变体是通过适当的强制转换运算符进行转换的,但是如果我在引号之间不使用任何unicode字符,那么使用不带L的表单会出现什么问题。这是一个很好的编程习惯,即使你不打算使用非unicode字符,还是使用L“”,还是有更多吗?

编辑:也许我意识到了答案。主要的问题是没有L,我遭受了调用不必要的运算符方法的性能损失?但两者都给出了相同的,正确的结果吗?

2 个答案:

答案 0 :(得分:2)

使用L宏创建一个宽字符串文字。没有L它只是一个狭窄的字符串。还要检查项目设置。您是将其构建为Unicode项目吗? 而不是使用L我建议使用_T()宏,只有当您的项目构建为Unicode时才扩展到L

再看看这个pagethis

因此换句话说,如果您希望您的字符串始终为Unicode,请使用L

<强>更新 我会推荐

CString str1 = _T("the following");

如果希望将字符串扩展为宽字符串

,则将项目构建为Unicode

答案 1 :(得分:1)

"the following:"的类型为const char*,而L"the following的类型为const wchar_t*。根据您对第二个文字的处理方式,您可能会隐式转换,调用某些函数的重载版本,导致模板专门用于wchar_t而不是char类型,或者您的代码无法编译(并不总是允许缩小和隐式演员表)。请注意,从wchar_tchar(隐式或显式)的转换被视为缩小,因为char通常为1个字节,而wchar_t的大小始终更大。据我记忆,这是特定于实现的,char应该是signed还是unsigned;那么从wchar_tchar的转换并不总能产生预期的结果,即使对于后者的ascii子集 - 你必须检查这些事情的标准。然后,如果您使用L类型的文字,您的程序也将需要更多内存。与C ++一样,您需要为使用的内容付费,因此如果不需要unicode字符,请不要使用wchar_t