【问题标题】:Is it possible to process math calculation before stringify a macro?是否可以在对宏进行字符串化之前处理数学计算?
【发布时间】:2018-08-14 00:20:32
【问题描述】:

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

我目前的定义如下。

#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" }

有可能吗? :/

【问题讨论】:

  • 不,我认为这不可能。预处理器只进行文本替换,算术不是文本替换。它只在条件表达式中进行算术运算。
  • 不,这种宏应该避免作为斑块

标签: c macros stringification


【解决方案1】:

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 /#elif )。您可以从中制作一个有用的表达式评估器,但有使用限制,但它似乎不适合这个用例。 数学需要被用于宏的使用(并且本质上是从头开始实现的),所以操作必须根据宏调用来实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多