代码之家  ›  专栏  ›  技术社区  ›  LeopardSkinPillBoxHat

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

  •  0
  • LeopardSkinPillBoxHat  · 技术社区  · 15 年前

    我刚刚度过 方式 在下面的代码片段中,尝试诊断为什么 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);
    

    每当我闯入 进程() 方法, AInvokeEventHandler 将永远是 true 不管我是否通过 .

    一个同事向我指出 值应在 内部的 上的括号 return 行,像这样:

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

    我一看到这个,就踢了自己。很明显,由于最初的编码器使用了冗余的 外面的 上的括号 返回 线。

    我的问题是,为什么编译器没有帮我找到这个?

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

    (HRESULT, bool)
    

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

    4 回复  |  直到 15 年前
        1
  •  1
  •   Jonathan Leffler    15 年前

    您遇到了逗号运算符,它计算并丢弃其左侧操作数的值,然后将其右侧操作数计算为表达式的值。

    另外,processEvent参数的默认值是您可以接受单参数调用的原因。

        2
  •  1
  •   1800 INFORMATION    15 年前

    你所写的:

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

    大致意思是:

    bool temp = false;
    m_pPool->GetFsm()->ProcessEvent(anEvent);
    return temp;
    
        3
  •  0
  •   Community CDub    8 年前

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

        4
  •  0
  •   heavyd    15 年前

    你看到的问题有两个方面。

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

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