报错E0513:不能将 “const wchar_t *“ 类型的值分配到 “LPWSTR“ (aka “wchar_t *“) 类型的实体
书籍:《Visual C++ 2017从入门到精通》的2.3.8 Win32控件编程
环境:visual studio 2022
内容:【例2.26】双击某行返回行内容的列表视图控件
说明:以下内容大部分来自腾讯元宝。
问题
以下代码报错:ColInfo1.pszText = _T("姓名");报错:不能将 "const wchar_t *" 类型的值分配到 "LPWSTR" (aka "wchar_t *") 类型的实体。
ColInfo1.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
ColInfo1.iSubItem = 0;
ColInfo1.fmt = LVCFMT_CENTER;
ColInfo1.cx = 100;
ColInfo1.pszText = _T("姓名");
ColInfo1.cchTextMax = 60;
::SendMessage(hListView, LVM_INSERTCOLUMN, WPARAM(0), LPARAM(&ColInfo1));
解决方法
在Visual Studio 2022中遇到“不能将 const wchar_t*
类型的值分配到 LPWSTR
类型”的错误,通常是由于字符串字面量的const属性与目标非const指针类型不匹配导致。以下是分场景解决方案:
一、直接移除const属性(推荐)
通过 const_cast
显式移除字符串字面量的const属性:
ColInfo1.pszText = const_cast<LPWSTR>(_T("姓名")); // [3](@ref)
详细内容可参考:
const_cast-CSDN博客https://blog.csdn.net/qq_20725221/article/details/146185373?sharetype=blogdetail&sharerId=146185373&sharerefer=PC&sharesource=qq_20725221&spm=1011.2480.3001.8118
适用场景:
- 字符串内容不需要修改(如静态标签)。
- 确保目标控件不尝试修改该字符串(如只读列表列名)。
二、创建可修改的缓冲区
若需动态修改字符串内容,建议分配新的非const内存:
wchar_t wszText[] = L"姓名";
ColInfo1.pszText = wszText; // [3](@ref)
优势:
- 避免直接修改字符串字面量(某些安全场景要求)。
- 支持后续对字符串的修改操作。
三、使用转换函数(备选方案)
若需处理多字节/宽字节混合编码,可通过以下函数转换:
// 方法1:MultiByteToWideChar(适用于char*转LPWSTR)
char* szText = "姓名";
int len = MultiByteToWideChar(CP_ACP, 0, szText, -1, NULL, 0);
wchar_t* wszText = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, szText, -1, wszText, len);
ColInfo1.pszText = wszText; // [1,2](@ref)
// 记得释放内存:delete[] wszText;
// 方法2:wcstombs_s(适用于已有wchar_t*)
const wchar_t* wszConstText = L"姓名";
size_t len = wcslen(wszConstText) + 1;
wchar_t* wszText = new wchar_t[len];
wcstombs_s(&len, wszText, len, wszConstText, _TRUNCATE);
ColInfo1.pszText = wszText; // [1](@ref)
四、编译模式检查
确保项目设置为Unicode字符集(否则_T
宏会生成char*
类型):
- 右键项目 → 属性 → 配置属性 → 常规 → 字符集 → 选择 使用Unicode字符集。
- 若需兼容多字节字符集,可结合
_UNICODE
宏定义使用。
总结
场景 | 推荐方案 | 引用来源 |
---|---|---|
静态字符串且无需修改 | const_cast<LPWSTR>(_T("...")) | 3 |
需动态修改字符串内容 | 分配wchar_t[] 缓冲区 | 3 |
多字节/宽字节混合编码 | 使用MultiByteToWideChar 或wcstombs_s 转换函数 | 1 2 |
若问题仍未解决,建议检查控件属性是否支持LPWSTR
类型(如某些旧版控件可能需要LPCWSTR
)。