在C中实现回调函数

时间:2010-04-29 15:11:30

标签: c

我是C的新手。我正在尝试使用函数指针实现回调函数。

我收到错误

:test_callback.c:10: error: expected identifier or ‘(’ before ‘void’

当我尝试编译以下程序时:

#include<stdio.h>

void (*callback) (void);

void callback_proc ()
{
  printf ("Inside callback function\n");
}

void register ((void (*callback) (void)))
{
  printf ("Inside registration \n");
  callback (); /* Calling an initial callback with function pointer */
}

int main ()
{
  callback = callback_proc;/* Assigning function to the function pointer */
  register (callback);/* Passing the function pointer */
  return 0;
}

这是什么错误?有人可以帮忙吗?

6 个答案:

答案 0 :(得分:19)

  1. register是一个C关键字:为该函数使用其他名称。

  2. 您在回调参数周围有额外的parantheses。它应该是:

    void funcName(void (*callback) (void))
    

答案 1 :(得分:3)

我建议使用typedef

#include<stdio.h>

typedef void (*callback_t) (void);
callback_t callback;

void callback_proc(void)
{
    printf ("Inside callback function\n");
}

void reg( callback_t _callback )
{
    printf ("Inside registration \n");
    _callback();
}

int main ()
{
    callback = callback_proc;
    reg(callback);

    return 0;
}

编辑:删除了注册问题

答案 2 :(得分:2)

您不能将'register'用作函数名称,因为它是C关键字。

答案 3 :(得分:0)

2个问题:

  • 您不能使用名称register,因为它是关键字(不再常用,但它仍然存在)
  • 更改函数的定义
    void wasRegister((void (*callback) (void)))
    

    为:

    void wasRegister(void (*callback) (void))
    

    (摆脱参数声明周围的parens。

另外,您可能会收到警告callback_proc()没有与callback变量匹配的延迟(取决于您编译程序的方式 - 如C或C ++),因此您可能希望更改其声明:

void callback_proc (void)

明确表示不需要参数。

答案 4 :(得分:0)

type safe callbacks查看ccan。它是暴露一个类型化的函数指针供世界使用的一件事,另一个是确保理智的投射。

答案 5 :(得分:0)

#include<stdio.h>

typedef void (*callback_func) (void);

static callback_func the_callback = 0;

void process (void)
{
  printf ("Inside process function\n");
}

void callback_register (callback_func cb)
{
  the_callback = cb;
  printf ("Inside registration \n");
}

void callback(void)
{
    the_callback();
}

int main (void)
{
  callback_register(process); /* Passing the function pointer */
  callback();
  return 0;
}

如果此代码已模块化,则会声明the_callback静态更有意义,然后您将被迫调用callback_register以设置它,并callback以便调用它 - the_callback在实现(.c)之外是不可访问的,只有函数声明在标题(.h)中。