解决_tcscpy_s操作NOTIFYICONDATA成员触发C26485警告的问题
问题根因
你之前修改不生效的核心问题是取地址符&的语法位置错误,m_sNTD.&szInfoTitle[0]是非法语法,正确写法是将&放在成员访问表达式的最前面。
方案1:使用数组版本的_tcscpy_s重载(最推荐)
直接利用标准库对固定长度数组的重载,不需要手动计算大小、不需要额外处理指针衰减,同时天然避免缓冲区溢出风险:
// 编译器会自动推导数组长度,既无警告也更安全 _tcscpy_s(m_sNTD.szInfoTitle, strInfoTitle); _tcscpy_s(m_sNTD.szInfo, strInfo); _tcscpy_s(m_sNTD.szTip, strTip);
CString会自动转换为LPCTSTR类型,不需要手动强制转换。
方案2:修正取地址语法抑制警告
如果需要保留你现有的传参逻辑,把取地址符的位置改对即可:
_tcscpy_s(&m_sNTD.szInfoTitle[0], gsl::narrow<rsize_t>(strInfoTitle.GetLength()) + 1, (LPCTSTR)strInfoTitle); _tcscpy_s(&m_sNTD.szInfo[0], gsl::narrow<rsize_t>(strInfo.GetLength()) + 1, (LPCTSTR)strInfo); _tcscpy_s(&m_sNTD.szTip[0], gsl::narrow<rsize_t>(strTip.GetLength()) + 1, (LPCTSTR)strTip);
这种写法明确传递的是首元素指针,不会触发数组到指针的衰减警告。
方案3:局部抑制警告
如果不想修改业务代码,可以用MSVC的pragma指令单独抑制这几行的警告:
#pragma warning(suppress: 26485) _tcscpy_s(m_sNTD.szInfoTitle, gsl::narrow<rsize_t>(strInfoTitle.GetLength()) + 1, (LPCTSTR)strInfoTitle); #pragma warning(suppress: 26485) _tcscpy_s(m_sNTD.szInfo, gsl::narrow<rsize_t>(strInfo.GetLength()) + 1, (LPCTSTR)strInfo); #pragma warning(suppress: 26485) _tcscpy_s(m_sNTD.szTip, gsl::narrow<rsize_t>(strTip.GetLength()) + 1, (LPCTSTR)strTip);
suppress指令只会让下一行代码的指定警告失效,不会影响全局的警告检查规则。
补充说明:NOTIFYICONDATA里的宏分支作用
结构定义里的#if...#else分支是用来兼容不同版本的Windows Shell:当你的项目编译目标是IE5及以上版本时,szTip的长度是128字符,更早的版本则为64字符。你使用sizeof(NOTIFYICONDATA)给cbSize赋值后,系统会自动识别你使用的结构版本,不需要额外处理。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

