C 预处理器 - 将变量传递给子宏

问题描述 投票:0回答:1

我目前正在用 c 语言编写一个简单的游标库,用于解析修复结构化字符串。 例如,它允许将以下字符串解析为先前定义的变量,如下所示(github):

char *test_string = "27,19";
S_CCURSOR_HANDLER cursor = {0};
ret = ccursor_init(&cursor, test_string, strlen(test_string));

uint8_t value_a = 0;
uint8_t value_b = 0;

// parse int values
ret &= ccursor_read_u8(&cursor, &value_a);
ret &= ccursor_skip_char(&cursor, ',');
ret &= ccursor_read_u8(&cursor, &value_b);

// check if empty
ret &= ccursor_is_empty(&cursor);

这工作正常,但为了使界面更方便一点,我还想提供一些基于宏的定义。 例如:

CCURSOR_PARSER(macro_parser, "27,19", U8(value_a) U8(value_b));

我现在的问题是,我太愚蠢了,无法正确理解宏观逻辑。 目前,我有以下宏代码:

#define U8_EVAL(_var, _cur)                                                    \
  uint8_t _var = 0;                                                            \
  _cur##_ret &= ccursor_read_u8(&_cur, &_var);

#define U8(_var) U8_EVAL(_var, _cur)

#define CCURSOR_PARSER(_cur, _str, _pattern)                                   \
  bool _cur##_ret = false;                                                     \
  S_CCURSOR_HANDLER _cur = {0};                                                \
  _cur##_ret = ccursor_init(&_cur, _str, strlen(_str));                        \
  _pattern

这无法编译,因为它抱怨

_cur
是 U8 到 U8_EVAL 宏扩展中的第一次使用。我的一般问题实际上是,我是否可以以某种方式将父宏
_cur
中的
CCURSOR_PARSER
的值注入到所有子宏中,例如 U8、U16 等

最简单的解决方案是使用 _cur 扩展 U8 (

U8(_var, _cur)
),但这不会使用户代码变得更好;它将扩展到
CCURSOR_PARSER(macro_parser, "27,19", U8(value_a, macro_parser) U8(value_b, macro_parser));
,这不是我的目标。

有没有办法将 _cur 传递给所有子宏?

c macros c-preprocessor
1个回答
0
投票

我就关票了,因为图书馆的界面已经足够好了。正如上面的评论所排除的那样,该宏只会让用户感到困惑,并且不会增强可读性。

© www.soinside.com 2019 - 2024. All rights reserved.