使用 SetIcon 时出现警告 C6387

Posted

技术标签:

【中文标题】使用 SetIcon 时出现警告 C6387【英文标题】:Warning C6387 when using SetIcon 【发布时间】:2021-12-15 17:07:38 【问题描述】:

代码:

m_hStatusBarZoomFactorIcon =
        CMeetingScheduleAssistantApp::HICONFromCBitmap(
m_mapMenuBitmap[MAKEWPARAM(MenuNavigation::View, SubMenuPos::Zoom)]);
    VERIFY(m_hStatusBarZoomFactorIcon);
    m_StatusBar.GetStatusBarCtrl().SetIcon(
        to_underlying(StatusBarPane::ProgressOrZoomFactor), m_hStatusBarZoomFactorIcon);

变量分别为HICONCStatusBar。为什么我会收到此警告?

警告C6387 m_hStatusBarZoomFactorIcon 可能是0:这不符合函数CStatusBarCtrl::SetIcon 的规范。

【问题讨论】:

【参考方案1】:

在调用 SetIcon() 函数之前,您应该添加代码以检查 m_hStatusBarZoomFactorIcon 是否有效(即 不是 null):

m_hStatusBarZoomFactorIcon =
    CMeetingScheduleAssistantApp::HICONFromCBitmap(
        m_mapMenuBitmap[MAKEWPARAM(MenuNavigation::View, SubMenuPos::Zoom)]);
//  VERIFY(m_hStatusBarZoomFactorIcon); // vide infra
    if (m_hStatusBarZoomFactorIcon)  // Only use it if it's valid ...
        m_StatusBar.GetStatusBarCtrl().SetIcon(
            to_underlying(StatusBarPane::ProgressOrZoomFactor), 
            m_hStatusBarZoomFactorIcon);
    
    else 
        // Error handling code
    

注意:如果您依赖 VERIFY(m_hStatusBarZoomFactorIcon); 语句来处理该检查,那么请注意,除非还定义了 _DEBUG 宏(即在调试版本中),否则它实际上不会扩展)。来自 afx.h:

//...
#else   // _DEBUG

#define VERIFY(f)          ((void)(f))
///

【讨论】:

谢谢。我已将其包装在 if 测试中。但是关于VERIFY,官方文档指出:*VERIFY 宏在应用程序的调试和发布版本中评估自己的参数。*。 嗯,从技术上讲,是的 - 它的论点 正在评估中;但没有对评估结果采取任何行动。定义了_DEBUG,它变成:#define VERIFY(f) ASSERT(f) 有点毫无意义,不是吗!也可以使用ASSERT ... 我绝不会指责微软所做的任何事情都是毫无意义。 :) 或者,使HICONFromCBitmap 在成功时始终返回非NULL 值(并通过C++ 异常报告错误)。

以上是关于使用 SetIcon 时出现警告 C6387的主要内容,如果未能解决你的问题,请参考以下文章

在 MATLAB 中使用回归函数时出现排名不足警告

在 PIG 中执行命令时出现警告

使用 SVG 时出现 SF 符号不可用警告

CA2101 拨打外部电话时出现警告

使用准备好的语句时出现“还不允许访问属性”警告[重复]

在 Windows 8 上使用 OpenGL 时出现 DXGI 警告?