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

时间:2009-06-25 03:57:45

标签: c++ c compiler-construction hresult

我只花了方式太长时间试图诊断原因,在下面的代码片段中,ProcessEvent()方法似乎忽略了我传入的falseaInvokeEventHandler

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

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

每当我使用ProcessEvent()方法时,aInvokeEventHandler始终为true,无论我是否传入false

有一位同事向我指出false值应该在return行的内部括号内,如下所示:

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

一看到这个,我就踢了自己。发现这显然更难,因为原始编码器在return行使用了冗余的外部括号。

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

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

(HRESULT, bool)

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

4 个答案:

答案 0 :(得分:1)

您正在使用逗号运算符,该运算符计算并丢弃其左侧操作数的值,然后将其右侧操作数计算为表达式的值。

此外,ProcessEvent参数的默认值是您的单参数调用可接受的原因。

答案 1 :(得分:1)

你写的是什么:

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

意味着什么(粗略地):

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

答案 2 :(得分:0)

逗号实际上是一个有效的运算符 - 请参阅this post

答案 3 :(得分:0)

你看到的问题在于两件事。

  1. 逗号运算符正在丢弃 左边的值和 仅返回右侧值 (FASLE)

  2. HRESULT只是一个很长的值,因此有一个 隐含的价值转换 错误到HRESULT,因此没有编译器 错误。