C++17下Visual Studio中const wchar_t*转LPWSTR报E0513错误如何解决
错误原因分析
- E0513错误的核心是类型不匹配:
LPWSTR本质是wchar_t*,属于可写的宽字符指针;而L"2048"是宽字符串字面量,类型为const wchar_t[5],隐式转换后是const wchar_t*只读指针。C++标准不允许将只读指针直接赋值给可写指针,避免误修改只读内存段引发未定义行为。
修复方案
方案1:复制字符串到可写缓冲区(最安全,推荐)
如果你后续需要修改argv[1]的内容,或者需要符合严格的类型安全要求,将字面量复制到堆上分配的可写内存中即可:
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { LPWSTR* argv; int argCount; argv = CommandLineToArgvW(GetCommandLineW(), &argCount); if (argv[1] == nullptr) { // 分配可写内存,长度包含字符串末尾的\0 argv[1] = new wchar_t[5]; wcscpy_s(argv[1], 5, L"2048"); } // 后续使用完后记得释放内存避免泄漏 if (argCount >= 2 && argv[1] != nullptr) delete[] argv[1]; LocalFree(argv); // CommandLineToArgvW返回的内存必须用LocalFree释放 }
方案2:修改指针类型为只读(如果不需要修改argv内容)
如果你后续所有操作都只会读取argv里的内容,不会修改,可以直接把argv的声明改为指向常量的指针:
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { const wchar_t** argv; // 改为指向const wchar_t的指针数组 int argCount; argv = reinterpret_cast<const wchar_t**>(CommandLineToArgvW(GetCommandLineW(), &argCount)); if (argv[1] == nullptr) { argv[1] = L"2048"; // 类型匹配,不会报错 } LocalFree(const_cast<wchar_t**>(argv)); }
方案3:用const_cast强制转换(仅临时调试用,不推荐)
如果你能100%保证后续不会修改argv[1]指向的内容,可以用const_cast强制去掉字面量的const属性,注意:修改该指针指向的内容会触发未定义行为,严重时会直接导致程序崩溃:
if (argv[1] == nullptr) argv[1] = const_cast<LPWSTR>(L"2048");
内容的提问来源于stack exchange,提问作者Donald C. Spencer
相关产品推荐
相关产品推荐

