C语言变长嵌套数组常量初始化定义技巧

有时候,我们需要在代码里配置一些常量结构,比如一个固定的动作流程ActionFlow:包含N(即flow_num)个动作列表(ActionArray),每个动作列表包含M(即act_num)个可并行执行的动作ID。

cpp 复制代码
// 动作序列:并行执行的动作ID列表
typedef struct {
    int* p_act_arr;     // 元素指针
    int act_num;        // 元素数量
} ActionArray;

// 动作列表:按顺序执行的动作序列
typedef struct {
    ActionArray* p_flow_arr;    // 元素指针
    int flow_num;               // 元素数量
}ActionFlow;

直观看,我们希望这样配置,一目了然,但这不符合C/C++的语法规则

cpp 复制代码
// 配置固定的动作序列
ActionFlow g_act_flow = {
    {
        {{1, 2},          2},     // 第0个可并行执行的动作
        {{3, 4, 5, 6, 7}, 5},     // 第1个
        {{8},             1},     // 第2个
    },
    3                             // 共3个
};

符合规则的语法大概是这样的,看起来显得有些冗长

cpp 复制代码
static int s_act_0[] = {1, 2};
static int s_act_1[] = {3, 4, 5, 6, 7};
static int s_act_2[] = {8};
static ActionArray s_act_arr[] = {
    {s_act_0, sizeof(s_act_0)/sizeof(int)},
    {s_act_1, sizeof(s_act_1)/sizeof(int)},
    {s_act_2, sizeof(s_act_2)/sizeof(int)},
}; 
ActionFlow g_act_flow = {s_act_arr, sizeof(s_act_arr)/sizeof(ActionArray)};

为了让定义更简洁,尽可能的只提供{1,2},{3,4,5,6,7}这些我们关心的业务数据,我们可以使用C99中引入的复合字面量 (compound literals,对应C++中的列表初始化‌(list initialization))来简化上述的变长嵌套数组常量初始化定义:

cpp 复制代码
#define ARRAY(type, ...) (type[])__VA_ARGS__, sizeof((type[])__VA_ARGS__)/sizeof(type)
#define ACTARR(...) ARRAY(int, __VA_ARGS__)
#define ACTIONFLOW(name, ...) ActionFlow g_##name = {ARRAY(ActionArray, __VA_ARGS__)}
ACTIONFLOW(act_flow, {         \
    {ACTARR({1, 2})},          \
    {ACTARR({3, 4, 5, 6, 7})}, \
    {ACTARR({8})}              \
});

还有更简洁实用的方法吗?欢迎留言讨论。

相关推荐
酸菜牛肉汤面2 分钟前
5、索引的数据结构(b+树,hash)
数据结构·b树·哈希算法
米优1 小时前
C/C++中实现自定义自动释放堆内存空间类
c语言·开发语言·c++
binary思维1 小时前
C语言应用领域及操作Excel方法
c语言
LinHenrY12272 小时前
初识C语言(预处理详解)
c语言·开发语言
爱学习的小仙女!2 小时前
顺序表定义、特点和基本操作(含C代码详细讲解)及时间复杂度
数据结构·算法
superman超哥2 小时前
仓颉内存管理深度探索:引用计数的实现原理与实战
c语言·开发语言·c++·python·仓颉
TechPioneer_lp2 小时前
27届暑期实习内推:网易美团京东快手等
数据结构·c++·人工智能·笔记·机器学习·面试
黎雁·泠崖2 小时前
C 语言结构体全解析:声明 + 内存对齐 + 位段 + 传参优化
c语言·开发语言
月明长歌3 小时前
【码道初阶】Leetcode136:只出现一次的数字:异或一把梭 vs HashMap 计数(两种解法完整复盘)
java·数据结构·算法·leetcode·哈希算法
Once_day3 小时前
CC++八股文之基础语法(2)
c语言·c++