0

次のコード スニペットで、メソッドが for に渡した値を無視しているように見える理由を診断するのに時間がかかりすぎまし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常に になります。truefalse

false次のように、値が行の内側の括弧内にある必要があることを指摘するのに、同僚が必要でした。return

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

これを見た瞬間、自分を蹴り飛ばしました。元のコーダーが行で冗長な外側の括弧を使用したため、これを見つけるのは明らかに難しくなりましたreturn

私の質問は、コンパイラがこれを認識しなかったのはなぜですか?

私のメソッドは を返してHRESULTいますが、上記の元のコードでは、括弧内に値の複合セットを明確に返しています。

(HRESULT, bool)

このような表記法は C/C++ 標準で受け入れられますか? もしそうなら、これを許可する目的は何ですか? それともコンパイラのバグですか?

4

4 に答える 4

1

左側のオペランドの値を評価して破棄し、右側のオペランドを式の値として評価するコンマ演算子に苦しんでいます。

また、ProcessEvent への引数のデフォルト値は、引数が 1 つの呼び出しが受け入れられた理由です。

于 2009-06-25T04:03:01.683 に答える
1

何を書きましたか:

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

それが意味すること(おおまかに):

bool temp = false;
m_pPool->GetFsm()->ProcessEvent(anEvent);
return temp;
于 2009-06-25T04:04:38.517 に答える
0

あなたが見ている問題は 2 つの点にあります。

  1. コンマ演算子は左側の値を捨てて、右側の値だけを返しています (fasle)

  2. HRESULT は単なる long 値であるため、値 false から HRESULT への暗黙的な変換が行われるため、コンパイラ エラーは発生しません。

于 2009-06-25T04:28:48.803 に答える
0

コンマは実際には有効な演算子です。この投稿を参照してください。

于 2009-06-25T04:04:01.433 に答える