You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:36:04