近来看了一个代码,这种代码结构需要设计好一些基础业务功能proc_fns, 有了这些基础proc_fns后,就可以通过xml来配置宏TEST_SCRIPT,生成对应的脚本源文件。
比较多的使用是base_fns的参数,有事件id,事件数据msg,有事件回调函数指针callback。
通过多种结合,代码里面的结构容器是数组,可以使用其他容器代替。
数组的是基础,而且快捷便利,执行流程通过判断下标来进行索引和遍历。比如索引对应id,遍历可以是NEXT(递增)或END(数据最大值)
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 typedef const void *data_t; 5 typedef void (*base_fns)(data_t data); 6 typedef struct { 7 bool flag; 8 }proc_dat_t; 9 typedef struct{ 10 base_fns proc; 11 }proc_fns_t; 12 typedef struct{ 13 const proc_fns_t* const * script_procs; 14 const data_t* data; 15 size_t iSize; 16 } proc_script_t; 17 18 #define GET_FNS(fns, data) &fns 19 #define GET_DATA(fns, data) data 20 #define SCRIPT_LIST(name, list) \ 21 const proc_fns_t * name##_procs[] = {list(GET_FNS)}; \ 22 const data_t name##_procs_data[] = {list(GET_DATA)}; \ 23 const proc_script_t name##_script = {\ 24 name##_procs,\ 25 name##_procs_data,\ 26 sizeof(name##_procs)/sizeof((name##_procs)[0]),\ 27 } 28 29 void func1(data_t arg) 30 { 31 const proc_dat_t* dat = (const proc_dat_t *)arg; 32 printf("That's func1:%d\n", dat->flag); 33 } 34 void func2(data_t arg) 35 { 36 const proc_dat_t* dat = (const proc_dat_t *)arg; 37 printf("That's func2:%d\n", dat->flag); 38 } 39 void func3(data_t arg) 40 { 41 const proc_dat_t* dat = (const proc_dat_t *)arg; 42 printf("That's func3:%d\n", dat->flag); 43 } 44 45 const proc_dat_t ProDataDisable= {false}; 46 const proc_dat_t ProDataEnable = {true}; 47 48 #define DATA_DISABLE ((data_t)&ProDataDisable) 49 #define DATA_ENABLE ((data_t)&ProDataEnable) 50 51 const proc_fns_t DATA1 = {func1}; 52 const proc_fns_t DATA2 = {func2}; 53 const proc_fns_t DATA3 = {func3}; 54 55 #define TEST_SCRIPT(ENTRY) \ 56 ENTRY(DATA1, DATA_DISABLE), \ 57 ENTRY(DATA2, DATA_ENABLE), \ 58 ENTRY(DATA1, DATA_ENABLE), \ 59 ENTRY(DATA3, DATA_ENABLE), \ 60 ENTRY(DATA1, DATA_DISABLE) 61 62 SCRIPT_LIST(test, TEST_SCRIPT); 63 64 int main(int argc, char* argv[]) 65 { 66 printf("Pro:Test. Build:%s. %s\n", __DATE__, __TIME__); 67 printf("Size:%u\n", test_script.iSize); 68 for (size_t i = 0; i < test_script.iSize; i++) { 69 ((test_script.script_procs)[i])->proc((test_script.data)[i]); 70 } 71 72 return (EXIT_SUCCESS); 73 }