编译时如何将同类型已初始化结构体数组的数据插入到另一结构体数组中?
解决方案
要让info2在编译阶段就拥有3个元素,且前两个与info1完全一致,直接利用C的初始化列表特性即可实现,无需手动复制结构体字段:
typedef struct info { int id; char* name; } info_t; static info_t info1[] = { { .id = 0, .name = "aaa" }, { .id = 1, .name = "bbb" }, }; // 直接引用info1的元素作为info2的前两项,再追加自定义元素 static info_t info2[] = { info1[0], info1[1], { .id = 2, .name = "ccc" }, };
如果info1的元素数量可能变化,不想每次手动维护索引,可以用宏来自动展开数组元素(适配C11及以上标准):
// 定义宏展开info1的所有元素 #define EXPAND_INFO1 info1[0], info1[1] static info_t info2[] = { EXPAND_INFO1, { .id = 2, .name = "ccc" }, };
关键说明
- 上述实现都在编译阶段完成数组初始化,
info2的大小会被编译器自动推导为3,前两个元素与info1的内存内容完全一致。 - 第一种写法最直观,适合元素数量固定的场景;宏展开写法适合
info1元素可能变动的情况,减少重复修改的工作量。
内容的提问来源于stack exchange,提问作者francesco64
相关产品推荐
相关产品推荐

