无法将类型“ const char *”的值分配给类型“ LPSTR”的实体

Jac*_*iro 4 c++ visual-c++

这个问题可能已经有了答案,但是我觉得我需要问这个问题,因为我似乎无法获得我所需的答案,因为该代码在VS Express Edition上运行良好,因此可以在VS Community 2017上正常工作。

我正在尝试实现从ac项目中获取的代码,但看不到如何解决该错误:

无法将类型“ const char *”的值分配给类型“ LPSTR”的实体

无法从“ const char [7]”转换为“ LPSTR”

    MENUITEMINFO mii = { 0 };

    mii.cbSize = sizeof(MENUITEMINFO);
    mii.fMask = MIIM_TYPE;
    mii.fType = MFT_STRING;
    mii.dwTypeData = _T("item 1"); // error is on this line
    mii.dwTypeData = _T("item 2"); // error is on this line also
Run Code Online (Sandbox Code Playgroud)

注意:

  1. 这是c ++项目上的c代码。它在VS Express Edition中有效,但无法在VS Community 2017上编译
  2. VS Express Edition 我只是将“字符集”更改为“多字节”,它可以工作,但是在VS Community 2017上似乎没有任何作用,我看不到如何修复代码本身

Mic*_*zel 8

字符串文字是类型的const char[N],其内容不得修改。隐式转换字符串文字为的能力char*仅在C ++中才存在,以便与C向后兼容。这是非常危险的事情,已被永久弃用,最终在C ++ 11中被删除。Visual Studio 2017将默认语言标准切换为C ++ 14,这很可能是您的代码在那里停止工作的原因。如果您绝对肯定地知道所指向的字符串不会被修改,则可以使用const_cast

MENUITEMINFO mii = { 0 };

mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_TYPE;
mii.fType = MFT_STRING;
mii.dwTypeData = const_cast<char*>("item 1");
Run Code Online (Sandbox Code Playgroud)

理想情况下,您只会使用const char*,但与某些旧的C API互操作时,不幸的是,有时需要使用const_cast。在执行这种操作之前,请始终检查API文档,以确保API不会尝试修改字符串的内容。

在您的情况下MENUITEMINFO,使用dwTypeDataa char*而不是a 的原因const char*很可能是该结构旨在与两者一起使用,GetMenuItemInfo并且SetMenuItemInfo前者希望使用指向缓冲区的指针,在该缓冲区中它将写入字符串,而后者则希望指向缓冲区的指针,它将从中读取字符串…

  • @SM我在任何地方都看不到资源,因此我不确定您认为应该通过`MAKEINTRESOURCE`实现什么。除此之外,不幸的是,在字符串文字上使用`MAKEINTRESOURCE`时,由于宏恰巧使用了大量的C风格的强制类型转换而无法编译,但这是完全错误的。不要那样做。 (3认同)