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

VC++ 2017中如何将const wchar_t转换为WCHAR*?代码报错E0167

解决VC++2017中const wchar_t转WCHAR*的E0167错误

嘿,这个问题我熟!你遇到的E0167错误本质是const类型不匹配导致的——字符串字面量L"../Engine/color.vs"的实际类型是const wchar_t*,而WCHAR其实就是wchar_t的typedef,直接把const的指针赋值给非const的WCHAR*,VC++的严格类型检查就会抛出这个错误,毕竟这样做可能会破坏const正确性(比如不小心修改只读的字符串字面量会导致程序崩溃)。

给你几个靠谱的解决办法,按优先级排序:

  • 最推荐:用const修饰变量
    如果你不需要修改这个字符串内容,直接把变量声明为const即可,这完全符合C++的编码规范,也不会有任何风险:

    const WCHAR *vsFilename = L"../Engine/color.vs";
    
  • 迫不得已时用const_cast强制转换
    如果是因为要调用某个老旧的API,它只接受非const的WCHAR*,而且你百分百确定这个API不会修改字符串内容,可以用const_cast去掉const属性:

    WCHAR *vsFilename = const_cast<WCHAR*>(L"../Engine/color.vs");
    

    ⚠️ 注意:绝对不要用这个指针去修改字符串!字符串字面量存在只读内存区,修改会触发未定义行为(比如程序直接崩溃)。

  • 需要修改字符串时,用可写缓冲区
    如果你确实要修改这个字符串的内容,得先把字符串复制到可写的内存区域里,比如用固定大小的数组:

    WCHAR vsFilename[MAX_PATH] = L"../Engine/color.vs";
    // 现在可以放心修改vsFilename里的内容了
    

    或者动态分配内存(记得用完释放):

    size_t strLen = wcslen(L"../Engine/color.vs") + 1; // +1是给终止符留位置
    WCHAR *vsFilename = new WCHAR[strLen];
    wcscpy_s(vsFilename, strLen, L"../Engine/color.vs"); // 用安全的wcscpy_s替代wcscpy
    
    // 用完后记得释放内存
    delete[] vsFilename;
    

内容的提问来源于stack exchange,提问作者윤재상

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:36:33