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})}              \
});

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

相关推荐
xinghuitunan1 小时前
时间转换(acwing)c/c++/java/python
java·c语言·c++·python
tekin2 小时前
Python 高级数据结构操作全解析:从理论到实践
数据结构·python·集合set·高级数据结构·集合操作·队列操作·堆操作
咸鱼过江2 小时前
观察者模式说明(C语言版本)
c语言·观察者模式
居然有人6543 小时前
23贪心算法
数据结构·算法·贪心算法
ctrigger3 小时前
AI回答:Linux C/C++编程学习路线
linux·c语言·c++
重生之我是冯诺依曼3 小时前
数据结构绪论
数据结构
h^hh4 小时前
洛谷 P3405 [USACO16DEC] Cities and States S(详解)c++
开发语言·数据结构·c++·算法·哈希算法
重生之我要成为代码大佬4 小时前
Python天梯赛10分题-念数字、求整数段和、比较大小、计算阶乘和
开发语言·数据结构·python·算法
Dreams°1234 小时前
【透过 C++ 实现数据结构:链表、数组、树和图蕴含的逻辑深度解析】
开发语言·数据结构·c++·mysql
wanjiazhongqi5 小时前
链表和STL —— list 【复习笔记】
数据结构·c++·笔记·链表