首页 > 解决方案 > 如何使用此方法将 C 宏扩展为结构和函数

问题描述

我想要一个宏

#define MY_STRUCT( /* ... /*) /* ... */

我想这样称呼

MY_STRUCT(point, double x, int y);

扩展到这个

typedef struct {
    double x;
    int y;
} point;

void init_point(point *p) {
     p->x = load_double_from_somewhere();
     p->y = load_int_from_somewhere();
}

宏应该能够处理我给它的任意数量的参数。我正在尝试通过宏自动为模型对象生成数据绑定,因为我一直在手动编写映射函数,这很烦人且重复(xml 到 C 结构)。我知道这是可能的,但我不知道怎么做。

标签: cmacros

解决方案


如果你想自动生成源代码,预处理器是你能得到的最糟糕的工具。

而且您绝对不能创建任何宏来生成具有任意数量字段的结构;C 预处理器不支持循环或递归。

但是如果最多 8 个字段/参数就足够了,尽管NON-STANDARD,这将在 gcc 和 clang 中执行:

#define MY_STRUCT(name, ...)  struct name { C2SC(__VA_ARGS__,,,,,,,,,) }
#define C2SC(a, b, c, d, e, f, g, h, ...)       a; b; c; d; e; f; g; h;

MY_STRUCT(foo, int bar, int baz, void *quux, void *xuq, char sq[12]);

这故意创建 a struct name { ... },而不是OP 中的 a :即使没有实际生成 a 的宏,typedef struct { ... } name它也已经足够钝了。MY_STRUCTtypedef


推荐阅读