我不明白为什么这个问题会被标记出来:
InitAssignmentCell(iNumRows - 1, strDescription, IMG_UNCHECKED, static_cast<LPARAM>(iNumRows - 1));
该方法的定义是:
InitAssignmentCell(int iRow, CString strAssignment, int iCheckState, LPARAM lParam)
最后一个参数是LPARAM
。然而,我看到了一些诡计:
警告C26451算术溢出:对4字节值使用运算符'-‘,然后将结果转换为8字节值。在调用运算符“-”之前将值转换为更大的类型,以避免溢出(io.2)。
我不明白这一点,因为iNumRows
是int
类型的。
我已经看到了类似的答案here,我的直觉是,这是一个错误的警告。
发布于 2020-11-10 11:46:10
来自MSVC静态分析器的C26451警告是非常迂腐的。它警告您,您可能假设升级是在演员之前自动执行的(但它不是)。
若要使警告保持沉默,请在算术之前执行强制转换。因此,与其:
InitAssignmentCell(iNumRows - 1, strDescription, IMG_UNCHECKED, static_cast<LPARAM>(iNumRows - 1));
使用:
InitAssignmentCell(iNumRows - 1, strDescription, IMG_UNCHECKED, static_cast<LPARAM>(iNumRows) - 1L);
您并不真正需要L
(或64位构建的LL
)后缀,但它向未来的读者表明您知道自己在做什么。一个更精确(但丑陋)的常量规范将是static_cast<LPARAM>(1)
。
https://stackoverflow.com/questions/64775688
复制相似问题