我目前正在用 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 传递给所有子宏?
我就关票了,因为图书馆的界面已经足够好了。正如上面的评论所排除的那样,该宏只会让用户感到困惑,并且不会增强可读性。