在对宏进行字符串化之前是否可以进行数学计算?

时间:2018-08-14 00:20:33

标签: c macros stringification

我在网上浏览了很多有关宏字符串化的示例,但是找不到类似的东西。

我目前的定义如下。

#define PIN_A (0+1)
#define PIN_B (0+2)
#define PIN_C (0+3)
#define str(x) #x
#define xstr(x) str(x)
#define PIN_DEF(x) { #x, xstr(PIN_ ## x) }

的输出
PIN_DEF(A)

将成为

{ "A", "(0+1)" }

但是,我真正需要的是

{ "A", "1" }

有可能吗? :/

1 个答案:

答案 0 :(得分:0)

Yes,有可能。

#include <boost/preprocessor/arithmetic.hpp>
#define PIN_A BOOST_PP_ADD(0,1)
#define PIN_B BOOST_PP_ADD(0,2)
#define PIN_C BOOST_PP_ADD(0,3)
#define str(x) #x
#define xstr(x) str(x)
#define PIN_DEF(x) { #x, xstr(PIN_##x) }

PIN_DEF(A)

请记住,boost预处理器的算术宏在256处饱和。

注意事项

预处理程序也可以计算表达式,但是唯一的方法是调用预处理程序条件指令(例如#if / { {1}} )。您可以使用使用限制,由此创建一个有用的表达式评估器,但似乎不适合此用例。 数学需要用于宏用法(并且基本上是从头开始实现的),因此必须根据宏调用来实现操作。