2013-06-18 39 views
1

我想在运行时使用提供的方法在c程序中设置全局可访问的回调函数。ansi c全局可访问的回调

到目前为止,我有以下几点:

principal.h 
----------- 

extern Callback globalCallback; 

principal.c 
----------- 

struct Callback { 
void (*doubleCallback)(double * speed); 
}; 

some_function(void (*updateDetected)(double*)){ 
    globalCallback.doubleCallback = updateDetected; 
} 


other.c 
----------- 

#include "principal.h" 

void another_function(){ 
    globalCallback.doubleCallback(&some_double); 
} 

这给出了一个错误,指出:未知类型名称“回调”

我试过几种方法,并已经得到了各种错误。

任何帮助,您可以提供将不胜感激。

回答

0
extern Callback globalCallback; 

使用这个代替:

extern struct Callback globalCallback; 

在C你需​​要一个typedef使用Callback作为一个类型名称时,你只申报struct Callback。这与C++不同,它将Callback声明为新类型。

如果你想为你的结构类型的类型别名(我不推荐),你可以这样做:

typedef struct Callback Callback; 
+0

添加结构给我一个错误,说“类型'结构回调'的不完全定义' – Geoff

+0

您还需要在'.h'文件中声明'结构回调'以使该声明可见。 – ouah

2

你有两个错误:第一,你没有定义它需要每个源文件中的结构。将结构的定义从principal.c源文件移动到principal.h头文件。

另一个是你没有定义类型Callback但是这个名字的结构。这意味着在声明和定义globalCallback变量时,您必须使用struct关键字。

+0

我是C的新手。你可以给我一个将它定义为类型而不是结构的例子 – Geoff

+0

@Geoff使用'typedef'关键字:'typedef struct {...} Callback;'现在你可以使用'Callback'作为其他类型。 –

+0

好的,这是我已经改变它...我得到链接器错误 'principal.h ----------- typedef struct {void(* speedCallback)(double *速度); }回调; extern回调globalCallback; principal.c ----------- some_function(void(* updateDetected)(double *)){ globalCallback.doubleCallback = updateDetected; } other.c ----------- 的#include “principal.h” 空隙another_function(){ globalCallback.doubleCallback(&some_double); }' – Geoff