【问题标题】:Warning C6387 when using SetIcon使用 SetIcon 时出现警告 C6387
【发布时间】: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 的规范。

【问题讨论】:

    标签: visual-c++ mfc statusbar code-analysis


    【解决方案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++ 异常报告错误)。
    猜你喜欢
    • 2021-11-07
    • 2021-11-04
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多