我需要在将表达式应用到预处理器之前将其转换为结果。这可能是一个简单的问题,但我无法找到一种方法。
我的预处理器是这样的:
#define ABCD(BITPOS) \
if(BIT##BITPOS##_MASK & 0x01) { \
Do something; }
在某个地方定义了BIT0_MASK
到BIT100_MASK
。
如果我调用ABCD(5)
,预处理器会将其转换为BIT5_MASK
并且工作正常。
但是,我想这样称呼它:
ABCD(START_VAL+2)
,
它给出了编译错误,指出BITSTART_VAL
未声明,)_MASK
未定义,并且有大量相关错误。
我怎样才能让它发挥作用?感谢您的回复。
答案 0 :(得分:2)
预处理器宏系统无法评估算术运算符。它只能将标记拼接在一起并替换标识符。
您需要找到另一种解决方案。
如果你真的必须这样做,那么Boost的人就会创建宏来执行一些基本的算术,只使用拼接和替换作为基础。但是,这不适合这项工作。
答案 1 :(得分:1)
看起来您需要inline
功能而不是宏。
inline size_t ABCD(unsigned int bitmask)
{
if (bitmask & 0x01U)
{
something();
}
}
inline
关键字将向编译器提示您希望粘贴代码而不是调用代码。