【发布时间】: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