C++ 如何抑制从CommCtrl.h中拉入的C26454代码分析?

C++ 如何抑制从CommCtrl.h中拉入的C26454代码分析?,c++,winapi,visual-studio-2019,C++,Winapi,Visual Studio 2019,我已经实现了一个虚拟列表视图控件。为此,我需要处理通知。我像过去一样做了: 案例WMU通知:{ 自动常量&nmhdr{*重新解释(lParam)}; if(nmhdr.idFrom==IDC\u我的列表\u视图和nmhdr.code==LVN\u getdispinow) { // ... 唯一改变的是我现在正在使用Visual Studio 2019。文档运行状况指示器不喜欢LVN\u getdispinow的定义方式。它是一个预处理器宏(LVN\u FIRST-77),其中LVN\u FI

我已经实现了一个虚拟列表视图控件。为此,我需要处理通知。我像过去一样做了:

案例WMU通知:{
自动常量&nmhdr{*重新解释(lParam)};
if(nmhdr.idFrom==IDC\u我的列表\u视图和nmhdr.code==LVN\u getdispinow)
{
// ...
唯一改变的是我现在正在使用Visual Studio 2019。文档运行状况指示器不喜欢
LVN\u getdispinow
的定义方式。它是一个预处理器宏
(LVN\u FIRST-77)
,其中
LVN\u FIRST
(0U-100U)
。触发:

算术溢出:'%operator%'操作在编译时产生负的无符号结果

我非常欣赏这个警告,只是当它来自我不控制的头文件时,我不能。我可以通过将受影响的代码包装在
pragma warning(disable:26454)
指令中来禁用这个警告(正确地恢复它之后的前一个状态).这是一个宏,但是,我需要在我的代码中这样做,无论我在哪里使用这些常量


当然可以。但这很乏味。有没有办法对
CommCtrl.h
中定义的所有常量取消此警告,而不影响对其他代码的检查?

以下代码为我解决了VS2019的此问题。您可以尝试一下:

case WM_NOTIFY: {
    auto const& nmhdr{ *reinterpret_cast<NMHDR const*>(lParam) };
    switch (nmhdr.code)
    {
    case LVN_GETDISPINFOW:
        if (nmhdr.idFrom == IDC_MY_LIST_VIEW)
        {
        }
        break;
    default:
        break;
    }
}
案例WMU通知:{
自动常量&nmhdr{*重新解释(lParam)};
交换机(nmhdr.代码)
{
案例LVN_GETDISPINFOW:
如果(nmhdr.idFrom==IDC\u我的\u列表\u视图)
{
}
打破
违约:
打破
}
}

请参阅“

使用pragma警告默认值还原它。@麦克:我很清楚如何还原以前的状态,方法是将其包装在
pragma警告(推)
/
pragma警告(pop)
(不是
pragma警告(默认值:26454)
!)。我只是不想以一种不太理想的方式在我所有的代码中使用一个在别处定义的常量。我管理的唯一方法(在
消息映射
声明中经常出现)是使用
#pragma警告(抑制:26454)
行(仅为下一行禁用警告)。仍然很乏味,但每次都略低于“推送…弹出”(两行)。使用分析>配置代码分析作为LVN_GETDISPINO是一个仅在使用时才进行计算的宏(即在定义它的系统标头之外),我看不出有什么方法可以告诉代码分析器在这种情况下忽略“来自系统头的内容”。虽然我不会特别推荐这样做,但您可以只使用
\undef LVN\u GETDISPINO
\define LVN\u GETDISPINO 0x12345678
(或任何实际的内容)在“顶部”标题中。奇怪的是,当放置在
开关
/
案例
中时,该常数不再触发代码分析诊断。不幸的是,在
WM\u NOTIFY
-处理程序中,我唯一不需要的是另一个嵌套级别的
开关
/
案例
s。我的总体意图不是这样的o提高代码的可读性。虽然这没有多大帮助,但它仍然回答了人们提出的问题。