c - 如何使用此方法将 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 结构)。我知道这是可能的,但我不知道怎么做。
解决方案
如果你想自动生成源代码,预处理器是你能得到的最糟糕的工具。
而且您绝对不能创建任何宏来生成具有任意数量字段的结构;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_STRUCT
typedef
推荐阅读
- python - dask 安装错误:ImportError:无法导入名称“计算”
- mongodb - 在 Ubuntu 20.04 上安装 Mongodb 的问题
- java - 如何在 for 循环中声明变量?
- ios - SwiftUI onTapGesture 块 NavigationLink 动作
- python - 删除 Pandas 列中列表中的重复项
- algorithm - 防作弊在线扑克加密算法
- r - 在 R 中,为什么在创建新行时列名会发生变化?
- python - 结合本地和 Google colab 资源或避免过多的内存使用
- spring-boot - 使用 Spring Data 保存在 Redis 中的值具有奇怪的前缀
- python-3.x - 动态拆分训练集时避免验证集上的数据扩充