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

时间:2019-04-02 11:28:24

标签: c++ visual-c++

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

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

  

类型“ 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

注意:

  1. 这是c ++项目上的c代码。它可以在 VS Express Edition 中使用,但不能在 VS Community 2017
  2. 上进行编译
  3. VS Express Edition ,我只是将字符集更改为“多字节”,并且可以使用,但是在 VS Community 2017 上似乎没有任何效果,我看不到如何解决该问题。代码本身

2 个答案:

答案 0 :(得分: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");

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

对于此处的MENUITEMINFOdwTypeDatachar*而不是const char*的原因很可能是该结构被使用GetMenuItemInfoSetMenuItemInfo都在其中,前者期望指向将在其中写入字符串的缓冲区的指针,而后者期望能够从其中读取字符串的缓冲区的指针……

答案 1 :(得分:0)

LPSTR是char *。即使有可能,也不应将const char *转换为char *。

只需分配空间,然后使用strcpy / memcpy复制该值。

或者,由于您正在使用MENUITEMINFO,请使用处理菜单项的特定功能之一(例如SetMenuItemInfoA)