如何解决“状态错误(活动)E0513无法将类型为“ const wchar_t *”的值分配给类型为“ wchar_t *”的实体”

迪玛·尤拉舍维奇(Dima Yurashevich)

我正在尝试使用C ++更改文件的属性,这是我做错了什么?该代码已完全使用

https://docs.microsoft.com/zh-cn/windows/win32/stg/writeread-sample

propspec.ulKind = PRSPEC_LPWSTR;
propspec.lpwstr = L"Property Name";// this line problem

propvarWrite.vt = VT_LPWSTR;
propvarWrite.pwszVal = L"Property Value"; // this line problem
阿空加瓜

正如错误消息已经表明的那样:字符串文字是const char[]const wchar_t[](取决于基础类型)的类型,并且您不能合法地将const数组分配给指向非const的指针(尽管某些编译器接受此类代码,只是发出警告)。 ,仅允许采用另一种方式。

现在的问题是,如何摆脱困境?

一般来说:

如果您100%确信(真的,至少没有疑问!)字符串不会被修改,则可以将const抛弃:

wchar_t* ptr = const_cast<wchar_t*>(L"...");

如果您最不怀疑(修改字符串文字是未定义的行为!),则将文字复制到数组中:

wchar_t value[] = L"...";
ptr = value;

此时,您需要确保被调用的函数不会拥有该字符串的所有权,但是:它会尝试释放该字符串吗?它将指针存储在某处以供以后使用,以便所指向的数组必须比调用函数的作用域更长寿吗?

如果是这样,您可能需要使用全局数组或malloc内存将字符串复制到...

在特定情况下:

如果你窥视到的文件读取写入功能,您会看到有问题的结构将被传递给const参数。好吧,实际上,这将使指针不变,而不是指向的数据不变,但是假设字符串不会被修改(如果需要,可以复制到某个地方–好了,写入某个文件)看起来仍然很安全,因此您实际上应该可以const_cast选择选项。

注意:该示例不会释放再次读取的字符串;现在非常有趣的所有权问题(谁将再次释放他们)?不幸的是,该文档并不准确...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章