【问题标题】:'Initializing': Cannot convert from 'const wchar_t[35]' to 'LPWSTR'“正在初始化”:无法从“const wchar_t[35]”转换为“LPWSTR”
【发布时间】:2020-06-25 16:13:12
【问题描述】:

我目前正在学习 C++,并想更改我的桌面墙纸。但是我在上面遇到了这个错误。

#include <string>
#include <iostream>
#include <Windows.h>

using namespace std; 

int main() {

LPWSTR test = L"C:\\Users\\user\\Pictures\\minion.png";

int result = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, 
test, SPIF_UPDATEINIFILE);


}

“Const wchar_t*”类型的值不能用于初始化 LPWSTR 类型的实体

有什么想法吗?

谢谢

【问题讨论】:

  • 项目 > 属性 > C/C++ > 语言,“一致性模式”= 否。
  • @HansPassant,谢谢。我使用了一个不起作用的标志......像这样QMAKE_CXXFLAGS -= /permissive- 在 VS2017 之外甚至不确定可能......有什么想法吗?

标签: c++ lpwstr


【解决方案1】:

LPWSTRwchar_t* 的别名,即指向非常量字符的指针。

字符串文字是一个 const 字符数组,在您的例子中是 const wchar_t[35]。它衰减成一个指向 const 字符的指针,指向文字中的第一个字符。

您不能将指向 const 的指针分配给指向非 const 的指针。这将允许对只读内存进行写访问。

改用LPCWSTR,它是const wchar_t*的别名。

LPCWSTR test = L"C:\\Users\\user\\Pictures\\minion.png"; 

【讨论】:

  • 虽然这很明显.. 面对使用 LPWSTR 推广(看起来很像)的 MSDN 示例时,我很怀疑.. 例如,这个示例:Querying for Event Information
  • 大多数示例是为 C 或早期 C++ 编写的,在 C++11 开始强制非常量指针不能再指向字符串文字之前。
  • 嗯,有道理。谢谢!
【解决方案2】:

MSVC 编译器变得越来越不宽容。总的来说这是一件好事。

L"C:\\Users\\user\\Pictures\\minion.png"const wchar_t[34] 类型的文字(额外的元素用于字符串终止符)。在某些情况下,衰减const wchar_t* 指针。

LPWSTR 不是 const 指针类型,因此在标准 C++ 编译器上编译将失败。

解决方法是使用const指针类型LPCWSTR

【讨论】:

    【解决方案3】:

    解决此编译错误的另一种方法是在项目属性 -> C/C++ -> 语言中将一致性模式设置为默认值。至少它在我的 VS2019 项目中有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 2013-08-11
      • 2013-04-19
      • 1970-01-01
      相关资源
      最近更新 更多