【问题标题】:Macro which defines the function定义函数的宏
【发布时间】:2013-01-31 21:33:13
【问题描述】:

我使用下面的宏来生成函数代码

#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

我不喜欢那个解决方案,它会降低性能 - 有没有人建议这样做?

【问题讨论】:

  • 您过度使用了## 运算符,在您使用它的大多数地方都不需要它。我什至不确定在某些地方使用它是否“合法”。
  • 你为什么要使用##isRet,而实际上你并没有与任何其他标识符连接?您可以简单地使用isRet。同样,您可以使用 fieldName 而不是 ##fieldName 来完成 3 次使用中的 2 次。
  • 我不确定您要完成什么,但我敢打赌,使用 inline 函数和指针可以达到相同的结果,只是以更优雅和可读的方式.
  • 为什么不是两个宏?返回的可以用不返回的来定义。
  • 你能准确地说出什么##不需要吗?

标签: c++ if-statement macros


【解决方案1】:

我倾向于使用更正确的 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_) 值是什么的情况下,上面纯粹是示例性的,我不应该认为它有效,但它应该为您指明一条新的方法。 这种方法将允许类型安全和体面的错误检查,其中定义不能很好地发挥作用。

【讨论】:

  • +1 OP 大概也想摆脱您解决方案中的U retval
  • Yakov,您能否说明您对退货/不退货的要求? (即,您要求退货和不退货的条件是什么?)干杯:)
猜你喜欢
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多