这个问题可能已经有了答案,但我觉得我需要提出问题,因为我似乎无法获得我所需的答案,因为该代码可以在 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
注意:
答案 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无法尝试修改字符串的内容。
对于此处的MENUITEMINFO
,dwTypeData
是char*
而不是const char*
的原因很可能是该结构被使用GetMenuItemInfo
和SetMenuItemInfo
都在其中,前者期望指向将在其中写入字符串的缓冲区的指针,而后者期望能够从其中读取字符串的缓冲区的指针……
答案 1 :(得分:0)
LPSTR是char *。即使有可能,也不应将const char *转换为char *。
只需分配空间,然后使用strcpy / memcpy复制该值。
或者,由于您正在使用MENUITEMINFO,请使用处理菜单项的特定功能之一(例如SetMenuItemInfoA)