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

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.lryc.cn/news/522122.html

相关文章:

  • 如何查看特定版本的Spring源码
  • 【深度学习】关键技术-激活函数(Activation Functions)
  • 网关相关知识
  • SpringBoot整合SpringSecurity详解
  • 【C++基础】enum,union,uint8_t,static
  • 单片机的原理及其应用:从入门到进阶的全方位指南
  • 如何使用 Go语言操作亚马逊 S3 对象云存储
  • 2025年应用与API安全展望:挑战与机遇并存
  • Linux安装docker,安装配置xrdp远程桌面
  • VD:生成a2l文件
  • 【SpringBoot应用篇】SpringBoot+MDC+自定义Filter操作traceId实现日志链路追踪
  • unity2022以上导出到AndroidStudio后更新步骤
  • 【ArcGIS初学】产生随机点计算混淆矩阵
  • Harmony面试模版
  • PCM5142集成32位384kHz PCM音频立体声114dB差分输出DAC编解码芯片
  • 浪潮云财务系统xtdysrv.asmx存在命令执行漏洞
  • 【网络编程】基础知识
  • ResNet (Residual Network) - 残差网络:深度卷积神经网络的突破
  • MOSFET体二极管的反向恢复分析
  • 80_Redis内存策略
  • 【HarmonyOS NAPI 深度探索6】使用 N-API 创建第一个 Hello World 原生模块
  • Java语言的软件工程
  • 【Mysql进阶知识】Mysql 程序的介绍、选项在命令行配置文件的使用、选项在配置文件中的语法
  • wireshark抓路由器上的包 抓包路由器数据
  • 玩转大语言模型——使用graphRAG+Ollama构建知识图谱
  • python flask简单实践
  • JAVA实现五子棋小游戏(附源码)
  • kotlin的dagger hilt依赖注入
  • 速通Docker === 常用命令
  • 【redis】键的全局命令