我正在使用C编写的smartwatch应用程序,我正在尝试将函数指针作为参数传递给我的按钮处理程序,以便可以从那里调用它。到目前为止,我已经完成了以下操作,但我得到一个错误,说我调用的对象不是一个函数。
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);
}
文档:
答案 0 :(得分:1)
在select_click_handler()
函数context
中void *
,因此您需要在调用它之前对其进行适当的类型转换。
假设context
为func
,您可以执行此操作
static void select_click_handler(ClickRecognizerRef recognizer, void *context){
((void (*)(void)) context)();
}
同样在这一行[{1}}中,您不需要action_bar_layer_set_context(action_bar, &func);
只传递&
而不是func
。
答案 1 :(得分:1)
在C中,void*
在许多地方用于代表通用指针,该指针可以是指向变量的指针,也可以指向函数的指针。你正在利用后者。
在使用时,您需要将转换为正确的类型,否则运行时将不知道该怎么做。在您的情况下,正确的类型是不带参数的函数,并返回void
。
为此,请在主叫站点使用((void (*)(void *))context)()
;在select_click_handler
答案 2 :(得分:0)
static void select_click_handler(ClickRecognizerRef recognizer, void *context){
context();
}
在此,context
只是指针变量,而不是函数。因此,您必须对其进行类型转换或正确定义以将其用于函数调用。
但是你将函数指针作为参数传递。所以,我希望这些链接可以帮助你