如何用递归宏实现嵌套参数的编译时数据结构生成?
编译时宏生成带父子关联的结构体数组方案需求
核心需求
需要在编译阶段通过宏定义,基于用户提供的嵌套宏结构,自动生成带有父子元素关联的结构体数组。每个被()包裹的元素对应数组中的一个条目,同时建立子元素与直接父元素、顶层父元素,以及父元素与首个子元素的索引关联。
结构体定义
实际使用的结构体如下:
#define NoValue 9000 /* 用于标识无关联值的特殊常量 */ struct { int a; int b; int c; unsigned int top; // 顶层父元素的数组索引 unsigned int parent; // 直接父元素的数组索引 unsigned int first; // 首个子元素的数组索引 } array[N];
其中N是编译时常量,代表数组元素总数。
用户输入的嵌套宏List
用户定义的嵌套宏结构示例如下(后续补充了元素名称用于尝试枚举生成):
// 初始无名称版本 #define List \ (10, -3, 8, \ (-1, -1, 13, \ (0, -7, 15, Empty)), \ (-4, 14, 13, Empty)), \ (17, 0, 1, Empty), \ (3, 3, 3, \ (1, 1, 0, Empty)) \ // 补充元素名称后的版本,尝试用于生成枚举 #define List \ (Name1, 10, -3, 8, \ (Name2, -1, -1, 13, \ (Name3, 0, -7, 15, Empty)), \ (Name4, -4, 14, 13, Empty)), \ (Name5, 17, 0, 1, Empty), \ (Name6, 3, 3, 3, \ (Name7, 1, 1, 0, Empty)) \
其中Empty表示当前元素没有子元素。
预期生成的数组示例
基于上述List宏,预期生成的数组如下:
array = { [0] = {10, -3, 8, NoValue, NoValue, 1/*首个子元素是array[1]*/}, [1] = {-1, -1, 13, 0/*顶层父元素是array[0]*/, 0/*直接父元素是array[0]*/, 2/*首个子元素是array[2]*/}, [2] = {0, -7, 15, 0/*顶层父元素是array[0]*/, 1/*直接父元素是array[1]*/, NoValue/*无子元素*/}, [3] = {-4, 14, 13, 0/*顶层父元素是array[0]*/, 0/*直接父元素是array[0]*/, NoValue/*无子元素*/}, [4] = {17, 0, 1, NoValue, NoValue, NoValue/*自身为顶层且无子元素*/}, [5] = {3, 3, 3, NoValue, NoValue, 6/*首个子元素是array[6]*/}, [6] = {1, 1, 0, 5/*顶层父元素是array[5]*/, 5/*直接父元素是array[5]*/, NoValue/*无子元素*/}, };
当前遇到的问题
尝试使用通用的FOR_EACH宏遍历嵌套结构时,处理嵌套子元素宏时失效,无法递归遍历整个树形结构并正确生成关联索引。
补充尝试与细节
为了先确定每个元素的索引,曾尝试给每个元素添加名称参数,通过宏生成枚举值,但嵌套元素的递归处理仍无法实现:
#define EnumFromList(name, a, b, c, ...) \ enum_##name, enum NameEnum { FOR_EACH(EnumFromList, List) };
上述代码无法正确解析嵌套子元素,导致枚举生成失败。
寻求可行实现方案
需要一套能递归解析嵌套宏结构的宏定义方案,完成以下目标:
- 遍历所有
()包裹的元素,为每个元素分配唯一的数组索引 - 为每个元素正确填充
top、parent、first字段:- 顶层元素的
top和parent设为NoValue - 子元素的
parent设为直接父元素的索引,top设为顶层父元素的索引 - 父元素的
first设为其首个子元素的索引,无子元素则设为NoValue
- 顶层元素的
- 最终生成符合语法要求的结构体数组初始化代码
内容的提问来源于stack exchange,提问作者user1806687
相关产品推荐
相关产品推荐

