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);
}

 

 

posted @ 2020-04-30 09:47  sciapex  阅读(221)  评论(0编辑  收藏  举报