C业务代码脚本
近来看了一个代码,这种代码结构需要设计好一些基础业务功能proc_fns, 有了这些基础proc_fns后,就可以通过xml来配置宏TEST_SCRIPT,生成对应的脚本源文件。
比较多的使用是base_fns的参数,有事件id,事件数据msg,有事件回调函数指针callback。
通过多种结合,代码里面的结构容器是数组,可以使用其他容器代替。
数组的是基础,而且快捷便利,执行流程通过判断下标来进行索引和遍历。比如索引对应id,遍历可以是NEXT(递增)或END(数据最大值)
#include<stdio.h> #include<stdlib.h> /***BASE***/ typedef const void *data_t; typedef void (*base_fns)(data_t data); typedef struct{ base_fns proc; }proc_fns_t; typedef struct{ const proc_fns_t* const * script_procs; const data_t* data; size_t iSize; } proc_script_t; #define GET_FNS(fns, data) &fns #define GET_DATA(fns, data) data #define SCRIPT_LIST(name, list) \ const proc_fns_t * name##_procs[] = {list(GET_FNS)}; \ const data_t name##_procs_data[] = {list(GET_DATA)}; \ const proc_script_t name##_script = {\ name##_procs,\ name##_procs_data,\ sizeof(name##_procs)/sizeof((name##_procs)[0]),\ } /***BSN***/ typedef struct { bool flag; }proc_dat_t; const proc_dat_t ProDataDisable= {false}; const proc_dat_t ProDataEnable = {true}; #define DATA_DISABLE ((data_t)&ProDataDisable) #define DATA_ENABLE ((data_t)&ProDataEnable) void func1(data_t arg) { const proc_dat_t* dat = (const proc_dat_t *)arg; printf("That's func1:%d\n", dat->flag); } void func2(data_t arg) { const proc_dat_t* dat = (const proc_dat_t *)arg; printf("That's func2:%d\n", dat->flag); } void func3(data_t arg) { const proc_dat_t* dat = (const proc_dat_t *)arg; printf("That's func3:%d\n", dat->flag); } const proc_fns_t FUNC1 = {func1}; const proc_fns_t FUNC2 = {func2}; const proc_fns_t FUNC3 = {func3}; #define TEST_SCRIPT(ENTRY) \ ENTRY(FUNC1, DATA_DISABLE), \ ENTRY(FUNC2, DATA_ENABLE), \ ENTRY(FUNC1, DATA_ENABLE), \ ENTRY(FUNC3, DATA_ENABLE), \ ENTRY(FUNC1, DATA_DISABLE) SCRIPT_LIST(test, TEST_SCRIPT); int main(int argc, char* argv[]) { printf("Pro:Test. Build:%s. %s\n", __DATE__, __TIME__); printf("Size:%u\n", test_script.iSize); for (size_t i = 0; i < test_script.iSize; i++) { ((test_script.script_procs)[i])->proc((test_script.data)[i]); } return (EXIT_SUCCESS); }