繁体   English   中英

编译器未标记HRESULT的错误返回值

[英]Compiler not flagging incorrect return value for HRESULT

我只花了太长的方式试图找出原因,在下面的代码片段中, ProcessEvent()方法似乎忽略了false我通过在价值aInvokeEventHandler

HRESULT 
CEventManager::
Process(Event anEvent)
{
    return (m_pPool->GetFsm()->ProcessEvent(anEvent), false);
}

// Definition of ProcessEvent()
HRESULT ProcessEvent(const Event& anEvent, bool aInvokeEventHandler = true);

每当我中断ProcessEvent()方法时,无论我是否传入falseaInvokeEventHandler始终为true

一个工作人员向我指出, false值应该在return行的内部括号内,如下所示:

return m_pPool->GetFsm()->ProcessEvent(anEvent, false); // Corrected code

一看到这个,我就踢自己。 显然,发现这一点变得更加困难,因为原始编码器在return线上使用了多余的外部括号。

我的问题是,为什么编译器没有为我解决这个问题?

我的方法返回一个HRESULT ,但是在上面的原始代码中,我显然返回了括号中的一组复合值,即:

(HRESULT, bool)

这样的符号在C / C ++标准中是否可以接受,如果可以,允许这样做有什么目的? 还是这是编译器中的错误?

您正遭受逗号运算符的困扰,该运算符求值并丢弃其左操作数的值,然后将其右操作数作为表达式的值求值。

同样,ProcessEvent参数的默认值是为什么您接受一个参数的原因。

你写的是:

return (m_pPool->GetFsm()->ProcessEvent(anEvent), false);

这意味着什么(大致):

bool temp = false;
m_pPool->GetFsm()->ProcessEvent(anEvent);
return temp;

逗号实际上是有效的运算符-请参阅这篇文章

您看到的问题有两点。

  1. 逗号运算符正在丢弃左侧的值,而仅返回右侧的值(fasle)

  2. HRESULT只是一个长值,因此将false值隐式转换为HRESULT,因此没有编译器错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM