使用 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);
变量分别为HICON
和CStatusBar
。为什么我会收到此警告?
警告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的主要内容,如果未能解决你的问题,请参考以下文章