在C中实现文件之间的回调

时间:2014-01-04 18:43:42

标签: c macros callback

我的程序包含以下文件:data_handler.c,app.c和callback_struct.h。

data_handler.c通过回调app.c从app.c中的函数中检索数据。

该程序应该允许用户在app.c中定义一组具有任意名称的函数。用户通过定义函数并将它们与callback_struct.h中的一组启动函数指针(ptr_func1,ptr_func2等)相关联来完成此任务。

使用这种方法,我想省去从data_handler.c到app.c中的用户函数进行显式调用的需要(这样,如果用户更改了函数名,就不必修改data_handler.c中的代码例如),我也不想将(#)app.c包含在data_handler.c中。

显然,有些东西我没有到这里来。如果有人能帮我理解我做错了什么,也许能给我一些迹象表明我是否与我建议的实施方法走在正确的轨道上,我将不胜感激

请参阅下面的实施:

callback_struct.h:

    struct callback_struct{
            int (*ptr_func1)(void);
            int (*ptr_func2)(void);
            // etc...
    };

    extern struct callback_struct user_functions; // should be defined in app.c

app.c

    #include "callback_struct.h"

    int user_function_func1(void);  
    int user_function_func2(void);  

    struct callback_struct user_functions={
            .ptr_func1 = user_function_func1, 
            .ptr_func2 = user_function_func2,
    };

    int  user_function_func1(void){

        int data = 1; // for example...

        return data;
    }

    int  user_function_func2(void){

        int data = 2; // for example...

        return data;
    } 

    // etc.....

data_handler.c

    #include "callback_struct.h"

    /*this function makes callbacks to app.c to retrieve data*/
     void get_data(int (*ptr)(void)){

              int retrieved_data=ptr();     
    }

    void main(void){

            get_data(user_functions.ptr_func1);
            get_data(user_functions.ptr_func2);
            // etc....
    }

2 个答案:

答案 0 :(得分:2)

这只是一个语法错误。只需替换

extern struct user_functions={

通过

struct callback_struct user_functions={

在你的app.c中它会起作用。

答案 1 :(得分:0)

当你声明一个全局变量'extern'时,你告诉编译器这个变量在代码中的其他地方被实例化(并可能被初始化)。

因此,你不应该将它声明为'extern'并在同一行中初始化它,这正是你在文件app.c中所做的。