在预处理器中转换字符串值

时间:2014-03-17 22:13:57

标签: c++ c-preprocessor

我需要在将表达式应用到预处理器之前将其转换为结果。这可能是一个简单的问题,但我无法找到一种方法。

我的预处理器是这​​样的:

#define ABCD(BITPOS) \
   if(BIT##BITPOS##_MASK & 0x01) { \
     Do something; }

在某个地方定义了BIT0_MASKBIT100_MASK。 如果我调用ABCD(5),预处理器会将其转换为BIT5_MASK并且工作正常。

但是,我想这样称呼它: ABCD(START_VAL+2), 它给出了编译错误,指出BITSTART_VAL未声明,)_MASK未定义,并且有大量相关错误。

我怎样才能让它发挥作用?感谢您的回复。

2 个答案:

答案 0 :(得分:2)

预处理器宏系统无法评估算术运算符。它只能将标记拼接在一起并替换标识符。

您需要找到另一种解决方案。

如果你真的必须这样做,那么Boost的人就会创建宏来执行一些基本的算术,只使用拼接和替换作为基础。但是,这不适合这项工作。

答案 1 :(得分:1)

看起来您需要inline功能而不是宏。

inline size_t ABCD(unsigned int bitmask)
{
  if (bitmask & 0x01U)
  {
    something();
  }
}

inline关键字将向编译器提示您希望粘贴代码而不是调用代码。