对上帝说实话,我现在正在失去理智。让我首先说一下,当我在其中定义文本和什么不是时,“MessageBox”函数在CodeBlocks中运行得非常好。但无论出于何种原因,Visual Studio对于MessageBox函数的内容都非常挑剔。
它一直告诉我,无论我把它放在哪里都对LPCWSTR“事物”无效。为了避免这种情况,我在下面对此进行了编程:
int main()
{
LPCWSTR a;
std::string s = "Please help me.";
a = (LPCWSTR)s.c_str();
LPCWSTR b;
std::string t = "MTS";
b = (LPCWSTR)t.c_str();
MessageBox(0,a,b, MB_OK | MB_ICONSTOP);
}
而不是按照我最初的想法工作,而不是因此得到了这个结果:
这对我来说非常紧张,我知道在此之前已经问了一次,所以请不要将我的问题标记为重复。如何使这段代码工作,以便我的信息以英文显示,并描绘我想说清楚的内容?
提前致谢,
MTS
答案 0 :(得分:7)
它出现在另一种语言中的原因(通常,你看到的语言是乱码)是因为你正在使用字符串类型而不是使用正确的字符串类型:
LPCWSTR b;
std::string t = "MTS";
b = (LPCWSTR)t.c_str();
此代码不将基于ANSI的窄字符串转换为宽字符串。转换会不转换字符串类型。如果你删除了强制转换,你会发现编译器会给你一个字符串类型/指针不匹配的错误。
由于您正在使用MessageBox
函数,这实际上是对MessageBoxW
的调用,这需要宽字符串参数。
在您的情况下调用MessageBoxW
的原因是MessageBox
将为MessageBoxA
或MessageBoxW
,具体取决于构建类型(MBCS
或分别为Unicode
)。对于CodeBlocks,您可能将项目设置为MBCS
,而在Visual Studio上,它设置为Unicode
,因此它适用于一个项目,而另一个项目则失败。
因此,修复是在这种情况下提供一个宽字符串:
LPCWSTR b;
std::wstring t = L"MTS";
b = t.c_str();
甚至是这样:
LPCWSTR b;
std::basic_string<WCHAR> t = L"MTS";
b = t.c_str();
如果您希望在没有编码更改的情况下为MBCS
和Unicode
版本生成相同的代码,则还可以使用以下代码:
#include <tchar.h>
//...
LPCTSTR b;
std::basic_string<TCHAR> t = _T("MTS");
b = t.c_str();
这使用_T
(或TEXT
宏)使字符串文字变窄或变宽,具体取决于构建类型。 TCHAR
可以是窄的也可以是宽的,具体取决于构建类型。
底线是这个 - 如果你正在调用一个需要字符串的函数,并且编译器给你一个字符串类型不匹配的错误,那么不尝试C风格强制转换以“修复”编译器错误。对于字符串尤其如此。相反,要么
1)提供正确的字符串类型,以便永远不需要进行转换,
或
2)调用接受字符串类型的正确函数(在本例中为MessageBoxA
),而不必应用强制转换。