定义函数的宏

时间:2013-01-31 12:39:54

标签: c++ if-statement macros

我使用以下宏来生成功能代码

#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 < / p>

 #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

我不喜欢这种解决方案,它会降低性能 - 任何建议都可以做到这一点吗?

1 个答案:

答案 0 :(得分: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_)值是什么的情况下,上面仅仅是示例性的,我不应该认为它有效,但是它应该指向一个新的途径。 这种方法将允许类型安全和体面的错误检查,其中定义不能很好地发挥。