当前位置: 首页 > article >正文

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

有时候,我们需要在代码里配置一些常量结构,比如一个固定的动作流程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.kler.cn/a/506786.html

相关文章:

  • 【进程与线程】进程的状态
  • 安装指南:LLaMA Factory、AutoGPTQ 和 vllm
  • openssl s_server源码剥离
  • 类模板的使用方法
  • 网络编程 - - TCP套接字通信及编程实现
  • LLM实现视频切片合成 前沿知识调研
  • 【排错记录】免密、nginx、cgroup、sshd
  • css 原子化
  • iOS页面设计:UIScrollView布局问题与应对策略
  • 【promethues 9090占用端口】没有网络,如何杀掉9090端口暂用的进程
  • Android 后台线程
  • 4. 使用springboot做一个音乐播放器软件项目【数据库表的创建】
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice 实现后台批量生成PDF文档
  • Math Reference Notes: 矩阵性质
  • python管理工具:conda部署+使用
  • 《黄金像凶杀案-再起》V1.2.0+Dlcs官方中文学习版
  • VIVADO FIFO (同步和异步) IP 核详细使用配置步骤
  • GO语言实现KMP算法
  • 代码随想录算法训练营第 9 天(字符串2)| 151.翻转字符串里的单词 卡码网55.右旋转字符串 KMP(跳过) 总结
  • 【Python基础篇】——第3篇:从入门到精通:掌握Python数据类型与数据结构
  • kubernetes第九天
  • 如何解决Outlook无法连接到服务器的问题
  • CentOS 9 Stream 上安装 Node.js 18.20.5
  • 《零基础Go语言算法实战》【题目 5-1】按照给定条件构建二叉树
  • Android SystemUI——车载CarSystemUI加载(八)
  • Gateway怎么实现限流的