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

server/2025/1/19 16:54:40/

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

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

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

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

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

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))来简化上述的变长嵌套数组常量初始化定义

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

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


http://www.ppmy.cn/server/159666.html

相关文章

第八章、python的类及其应用(8.1.1-8.2.1.2)------类的常见概念、类的构造器概述、空间化构造方法__new__()

目录 8.1 python类的常见概念 8.1.1面向过程与面向对象编程 8.1.2类、类地址、类实例对象地址、封装、继承、多态的概念 8.2 python类的构成详解及其性质 8.2.1类中的构造方法 8.2.1.1类的构造器概述 8.2.1.2空间化构造方法__new__() 第八章 python的类及其应用 本章主要讲述类…

无降智o1 pro——一次特别的ChatGPT专业模式探索

这段时间和朋友们交流 ChatGPT 的使用心得,大家都提到一个很“神秘”的服务:它基于 O1 Pro 模型,能够在对话里一直保持相对高水平的理解和回复,不会突然变得“降智”。同时,整体使用还做了免折腾的网络设置——简单一点…

Linux《Linux简介与环境的搭建》

在学习了C或者是C语言的基础知识之后就可以开始Linux的学习了,现在Linux无论是在服务器领域还是在桌面领域都被广泛的使用,所以Linxu也是我们学习编程的重要环节,在此接下来我们将会花大量的时间在Linxu的学习上。在学习Linux初期你可以会像初…

【青海省乡镇界】面图层+shp格式arcgis数据+乡镇名称和编码+wgs84坐标无偏移下载内容测评

本文将详细解析标题和描述中涉及的IT知识点,主要集中在地理信息系统(GIS)领域,特别是与ArcGIS软件和SHP文件格式相关的知识。 我们要理解"最新青海省乡镇界面图层"这一概念。在GIS中,图层是地理数据的一种组…

速通Docker === 目录挂载 卷映射

目录 目录挂载 1. 目录挂载的基本概念 2. 挂载命令 3. 配置Nginx启动页 4. 注意事项 卷映射 1. 创建数据卷 2. 运行Nginx容器并挂载数据卷 3. 查找数据卷的宿主机路径 4. 修改配置文件 5. 重启Nginx容器 6. 验证Nginx是否正常工作 Docker挂载总结 目录挂载 卷…

基于unity的多人家装应用的设计与实现

摘要 本课题根据主流家装应用存在的问题和结合了Unity3D引擎所具有的优势,在主流家装应用的基础上弥补了常见的缺憾,实现了一种新型的交互更强的家装展示系统。 本系统主要通过将家具模型资源和材质等资源导入Unity3D平台中,通过C#代码开发,搭建UGUI框架,实现室内漫游、家…

ESP8266 AP模式 网页配网 arduino ide

ESP8266的AP配网,可以自行配置网络,一个简单的demo,文档最后有所有的代码,已经测试通过. 查看SPIFFS文件管理系统中的文件 账号密码是否存在,如不存在进入AP配网,如存在进入wifi连接模式 // 检查Wi-Fi凭据if (isWiFiConfigured()) {Serial.println("找到Wi-Fi凭据&#…

C#实现字符串反转的4种方法

见过不少人、经过不少事、也吃过不少苦,感悟世事无常、人心多变,靠着回忆将往事串珠成链,聊聊感情、谈谈发展,我慢慢写、你一点一点看...... 1、string.Reverse 方法 string content "Hello World";string reverseStri…