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,提问作者윤재상
相关产品推荐
相关产品推荐

