将函数作为参数传递给C中的按钮处理程序

时间:2014-12-02 12:14:34

标签: c function-pointers pebble-watch

我正在使用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);
}

文档:

action_bar_layer_create

action_bar_layer_set_click_config_provider

action_bar_layer_set_context

3 个答案:

答案 0 :(得分:1)

select_click_handler()函数contextvoid *,因此您需要在调用它之前对其进行适当的类型转换。

假设contextfunc,您可以执行此操作

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只是指针变量,而不是函数。因此,您必须对其进行类型转换或正确定义以将其用于函数调用。

但是你将函数指针作为参数传递。所以,我希望这些链接可以帮助你

Function pointer as an argument