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 回答