不能将 "const char *" 类型的值分配给类型为 "LPSTR" 的实体
Value of type "const char *" cannot be assigned to an entity of type "LPSTR"
这个问题可能已经有了答案,但我觉得我需要问它,因为我似乎无法得到代码在VS Community 2017上按预期工作的答案,因为它在VS Express Edition上运行良好。
我正在尝试实现从 c 项目中获取的代码,但我看不到如何解决错误:
不能将类型为"const char *"的值分配给类型的实体 "LPSTR">
和
无法从"常量字符 [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
注意:
- 这是现在在 c++ 项目上的 c 代码。它在VS Express Edition中工作,但无法在VS Community 2017上编译 VS
- 速成版我只是将字符集更改为多字节,它有效,但在VS Community 2017上似乎没有任何效果,我看不到如何修复代码本身
字符串文字的类型是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
一起使用,其中前者需要指向缓冲区的指针,它将在其中写入字符串,而后者需要指向缓冲区的指针,它将从中读取字符串......
LPSTR 是 char *。您不应该从 const char * 转换为 char *,即使有可能时有方法。
只需分配空间,然后使用 strcpy/memcpy 复制值。
或者,由于您正在使用 MENUITEMINFO,请使用处理菜单项的特定函数之一(如 SetMenuItemInfoA)
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 'const char [26]' 和 'LPSTR ' 类型的无效操作数
- 类型 "const char *" 的参数与 "LPSTR" C++ 类型的参数不兼容
- 不能将 "const char *" 类型的值分配给类型为 "LPSTR" 的实体