这个问题可能已经有了答案,但是我觉得我需要问这个问题,因为我似乎无法获得我所需的答案,因为该代码在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)
注意:
字符串文字是类型的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前者希望使用指向缓冲区的指针,在该缓冲区中它将写入字符串,而后者则希望指向缓冲区的指针,它将从中读取字符串…
| 归档时间: |
|
| 查看次数: |
764 次 |
| 最近记录: |