php网站添加验证码,莱芜金点子信息港最新招聘信息港,哪些网站是用c语言做的,二维码制作网站有时候#xff0c;我们需要在代码里配置一些常量结构#xff0c;比如一个固定的动作流程ActionFlow#xff1a;包含N#xff08;即flow_num#xff09;个动作列表#xff08;ActionArray#xff09;#xff0c;每个动作列表包含M#xff08;即act_num#xff09;个可…有时候我们需要在代码里配置一些常量结构比如一个固定的动作流程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})} \
});
还有更简洁实用的方法吗欢迎留言讨论。