在C语言中将函数作为参数传递给按钮处理程序
我正在开发一个用C编写的应用程序,我正在尝试将函数指针作为参数传递到我的按钮处理程序中,以便从那里调用它。到目前为止,我已经做了以下工作,但我得到一个错误,我调用的对象不是函数在C语言中将函数作为参数传递给按钮处理程序,c,function-pointers,pebble-watch,C,Function Pointers,Pebble Watch,我正在开发一个用C编写的应用程序,我正在尝试将函数指针作为参数传递到我的按钮处理程序中,以便从那里调用它。到目前为止,我已经做了以下工作,但我得到一个错误,我调用的对象不是函数 void func(){ ... } static void select_click_handler(ClickRecognizerRef recognizer, void *context){ context(); } static void click_config_provider(void
void func(){
...
}
static void select_click_handler(ClickRecognizerRef recognizer, void *context){
context();
}
static void click_config_provider(void *context) {
window_single_click_subscribe(BUTTON_ID_SELECT, select_click_handler);
window_set_click_context(BUTTON_ID_SELECT, context);
}
int main(void){
...
action_bar = action_bar_layer_create();
action_bar_layer_set_click_config_provider(action_bar, click_config_provider);
action_bar_layer_set_context(action_bar, &func);
}
文件:
在
中选择\u单击\u handler()
函数上下文
是无效*
,因此在调用它之前需要适当地键入它
假设context
为func
,则可以执行此操作
static void select_click_handler(ClickRecognizerRef recognizer, void *context){
((void (*)(void)) context)();
}
同样在这一行action\u bar\u layer\u set\u上下文中(action\u bar,&func)
您不需要&
只需传递func
而不是&func
static void select_click_handler(ClickRecognizerRef recognizer, void *context){
context();
}
在这种情况下,context
只是指针变量,而不是函数。因此,您必须对其进行类型转换或正确定义,才能将其用于函数调用
但您正在传递函数指针作为参数。所以,我希望这些链接能帮助你
在C语言中,
void*
在许多地方被用来表示通用指针,它可以是指向变量的指针,也可以是指向函数的指针。你在利用后者
在使用时,您需要将其强制转换为正确的类型,否则运行时将不知道该做什么。在您的例子中,正确的类型是不带参数并返回void
的函数
为此,在调用站点使用
((void(*)(void*))上下文)(
;在选择\u单击\u处理程序
中,错误发生在哪一行?错误:调用的对象“上下文”不是函数。当试图在选择中调用它时,单击\u处理程序
上下文
不是一个函数,而是一个无效*
。您确定上下文是一个函数吗?如果是这样,这将调用强制转换,但我怀疑上下文是上下文。@Rakim,取决于您要调用的函数类型。@Rakim函数指针泛型原型是(返回类型)(*函数名)(argumnet列表)