0

次のマクロを使用して関数コードを生成します

#define EXTRACT_INSTRUCTION32_FIELD(insName,fieldName,fieldOffset) \
    insName##Instruction::##fieldName val; \
    val = static_cast<##insName##Instruction::##fieldName##>((hexIstruction & ##insName##Mask_##fieldName) >> fieldOffset); \
    return val

しかし、常に使いたくないreturn valです。また、このマクロを 2 つのマクロに分割したくありません。どうすればよいでしょうか。isRet

 #define EXTRACT_INSTRUCTION32_FIELD(insName,fieldName,fieldOffset,isRet) \
        insName##Instruction::##fieldName val; \
        val = static_cast<##insName##Instruction::##fieldName##>((hexIstruction & ##insName##Mask_##fieldName) >> fieldOffset); \
        if (##isRet)\
        return val

私はその解決策が好きではありません、それはパフォーマンスを低下させます - それを行うためのホットなアドバイスはありますか?

4

1 に答える 1

0

私は、インライン関数またはテンプレートを使用する、より C++ の正しい方法を使用する傾向があります。次のようなものです。

template <class T, U, V>
U extractInstruction32Field(T insName, U fieldName, V fieldOffset, W hexInstruction, bool isRet = false)
{
    U retval;
    retval = static_cast<U>((hexInstruction& insName::fieldName) >> fieldOffset);
    if isRet    {   return retval;  }
}

isRetブール値のデフォルトは false であるため、使用することを選択した場合にのみ値が返されることに注意してください。あなたの mask ( ##Mask_) 値が何であるかを知らなければ、上記は純粋に模範的なものであり、それが機能するとは思わないはずですが、新しいアプローチの道を示しているはずです. この種のアプローチは、型の安全性とまともなエラー チェックを可能にします。

于 2013-01-31T13:33:13.520 に答える