【发布时间】:2021-10-27 07:34:40
【问题描述】:
我看过这篇关于使用std::variant 的文章。这是因为以下代码引发了代码分析警告:
void CChristianLifeMinistryHtmlView::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == ID_TIMER_ZOOM)
{
//get the zoom value
VARIANT vZoom{};
vZoom.vt = VT_I4;
vZoom.lVal = 0;
ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, nullptr, &vZoom);
TRACE("zoom %d\n", vZoom.lVal);
//kill the timer
KillTimer(nIDEvent);
GetParent()->PostMessage(UWM_HTMLVIEW_CHANGE_ZOOM_MSG, vZoom.lVal);
return;
}
CHtmlView::OnTimer(nIDEvent);
}
警告:
警告C26476:表达式/符号
{{0, 0, 0, 0, {0}}}使用带有多个类型指针的裸联合“联合”:请改用variant(type.7)。
我开始尝试更改代码:
void CChristianLifeMinistryHtmlView::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == ID_TIMER_ZOOM)
{
//get the zoom value
std::variant<long> vZoom(0);
ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, nullptr, &vZoom);
TRACE("zoom %d\n", vZoom.lVal);
//kill the timer
KillTimer(nIDEvent);
GetParent()->PostMessage(UWM_HTMLVIEW_CHANGE_ZOOM_MSG, vZoom.lVal);
return;
}
CHtmlView::OnTimer(nIDEvent);
}
但问题是 ExecWB 需要 VARIANT * 而我不知道如何传递 std::variant。
【问题讨论】:
-
使用
VARIANT vZoom; VariantInit(&vZoom);进行初始化。或者按照建议使用variant_t或CComVariant,它们会自动执行此操作。 -
@BarmakShemirani 谢谢 -
VariantInit- 我不知道的另一个新功能!
标签: visual-c++ mfc code-analysis variant