【问题标题】:Passing functions as parameters to button handlers in C将函数作为参数传递给 C 中的按钮处理程序
【发布时间】:2015-01-30 16:30:30
【问题描述】:

我正在开发一个用 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

【问题讨论】:

  • 错误出现在哪一行?
  • 错误:调用的对象“上下文”不是函数。当试图在select_click_handler 中调用它时
  • context 不是函数,而是void *。你确定上下文是一个函数吗?如果是这样,这将需要演员,但我怀疑上下文是上下文。

标签: c function-pointers pebble-watch


【解决方案1】:

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

假设 contextfunc 你可以这样做

static void select_click_handler(ClickRecognizerRef recognizer, void *context){
    ((void (*)(void)) context)();
}

同样在这一行action_bar_layer_set_context(action_bar, &func); 你不需要& 只需传递func 而不是&func

【讨论】:

  • @Rakim,取决于您要调用的函数类型。
  • @Rakim 函数指针通用原型是(return type)(*function name)(argumnet list)
【解决方案2】:
static void select_click_handler(ClickRecognizerRef recognizer, void *context){
context();
}

这里,context 只是指针变量,不是函数。因此,您必须正确地进行类型转换或定义才能将其用于函数调用。

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

Function pointer as an argument

【讨论】:

    【解决方案3】:

    在 C 语言中,void* 在很多地方被用来代表一个通用指针,它既可以是指向变量的指针,也可以是指向函数的指针。您正在使用后者。

    在使用时,您需要将其转换为正确的类型,否则运行时将不知道该做什么。在您的情况下,正确的类型是不带参数并返回 void 的函数。

    为此,请在呼叫站点使用((void (*)(void *))context)();在select_click_handler

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 2017-12-30
      • 2013-11-15
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      相关资源
      最近更新 更多