C业务代码脚本

近来看了一个代码,这种代码结构需要设计好一些基础业务功能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 }

 

上一篇:Codeforces Round #638 (Div. 2) A~D


下一篇:Win下建立Socket时注意事项