类型'const char [26]'和'LPSTR'的无效操作数

时间:2017-07-05 18:03:13

标签: c++ string winapi

我的代码是

string  str = "C:\\Users\\mardare\\Downloads\\config";
LPSTR lp = const_cast<char *>(str.c_str());
MessageBox ( NULL, "The selected folder is : "+lp, "Bye!", MB_OK );

当我尝试构建它并运行时,我得到了这个错误

  

类型'const char [26]'和'LPSTR'

的无效操作数

4 个答案:

答案 0 :(得分:3)

LPSTR代表char * - 类型,字符串文字"The ..."代表const char[26]。您收到错误是因为在表达式"The selected folder is : "+lp中,您尝试将它们与运算符+“连接”,const char*char *类型的成员不支持。

但是+类型的成员支持运营商std::string;因此,您可以通过以下代码解决此问题:

string folder = "The selected folder is : " + str;
MessageBox ( NULL, folder.c_str(), "Bye!", MB_OK );

答案 1 :(得分:2)

您正在尝试将char*指针(从您的string变量获取)连接到const char[]数组(来自您的字符串文字)。你无法做到那种连接。

此外,const_cast不是必需的。

您必须将其中一个指针转换为string,例如:

string str = "C:\\Users\\mardare\\Downloads\\config";
const char *lp = str.c_str();
MessageBox ( NULL, (string("The selected folder is : ") + lp).c_str(), "Bye!", MB_OK );

或者:

string str = "C:\\Users\\mardare\\Downloads\\config";
const char *lp = str.c_str();
MessageBox ( NULL, ("The selected folder is : " + string(lp)).c_str(), "Bye!", MB_OK );

或者,只需摆脱char*中的string,您实际上并不需要它:

string str = "C:\\Users\\mardare\\Downloads\\config";
MessageBox ( NULL, ("The selected folder is : " + str).c_str(), "Bye!", MB_OK );

或者:

string str = "C:\\Users\\mardare\\Downloads\\config";
string msg = "The selected folder is : " + str;
MessageBox ( NULL, msg.c_str(), "Bye!", MB_OK );

或者:

string str = "C:\\Users\\mardare\\Downloads\\config";
ostringstream msg;
msg << "The selected folder is : " << str;
MessageBox ( NULL, msg.str().c_str(), "Bye!", MB_OK );

答案 2 :(得分:1)

如果在这行代码中考虑MessageBox的第二个参数:

MessageBox ( NULL, "The selected folder is : "+lp, "Bye!", MB_OK );
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

您可以看到一个字符串文字,即"The selected folder is : ",它是一个NUL终止的C样式原始char数组(错误消息中的const char [26]部分);并且您正在尝试“连接”使用运算符+lp,您在其中定义为LPSTR(即char*)代码。

此类操作定义,因此出现错误消息。

很明显,你的意图是连接两个字符串,并打印调用MessageBox API的结果字符串。

为此,请考虑使用C ++字符串 class 。如果您处于Win32 API边界,我认为ATL / MFC CString非常方便。或者,您可以使用标准字符串类,如std::string

std::string(和CString以及......)方便地定义了operator+()的正确重载,这使得可以用简单的语法连接字符串,例如:

string str = "C:\\Users\\mardare\\Downloads\\config";
string message = "The selected folder is : " + str;

此时,如果您要将消息std::string实例传递给MessageBox API(这是一个 C-interface API),您可以调用< strong> std::string::c_str() 方法:

MessageBox( NULL, message.c_str(), /* ... other params ... */ ); 

请注意,此代码将在ANSI / MBCS版本中编译(这是一个过时的构建设置; Unicode版本自VS2005以来一直是默认版本,超过10年前)。

在您的情况下,被调用的实际Win32 API是MessageBoxA(请注意A后缀)。

您的代码将无法在使用Unicode构建的VS解决方案中编译;在这些情况下,您可能希望使用显式MessageBoxA()调用。

编辑与您的错误消息没有直接关系,但您可能会感兴趣:如果您使用的是最新的Visual C ++编译器,则可能需要将NULL替换为{ {1}}在您的C ++代码中,您可以使用 raw 字符串文字来简化您编写路径的方式,如下所示:

nullptr

答案 3 :(得分:0)

您无法将const char[26](即您的"The selected folder is : "文字)和char*指针(即lp类型LPSTR变量加在一起},这是char*)。首先连接字符串,然后获得const char*,您可以将其传递给函数:

std::string str = R"(C:\Users\mardare\Downloads\config)"; //don't care about escape sequences, use raw string literals.
MessageBox(nullptr, ("The selected folder is : " + str).c_str(), "Bye!", MB_OK);