用C语言实现回调函数

用C语言实现回调函数,c,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

我是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;
}
#包括
作废(*收回)(作废);
无效回调程序()
{
printf(“内部回调函数\n”);
}
无效寄存器((void(*回调)(void)))
{
printf(“内部注册”);
回调();/*使用函数指针调用初始回调*/
}
int main()
{
callback=callback_proc;/*将函数赋值给函数指针*/
寄存器(回调);/*传递函数指针*/
返回0;
}


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

我建议使用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;
}
#包括
typedef void(*callback_t)(void);
回调(callback)t callback ;;
作废回拨程序(作废)
{
printf(“内部回调函数\n”);
}
void reg(回调\u t\u回调)
{
printf(“内部注册”);
_回调();
}
int main()
{
callback=callback\u proc;
reg(回调);
返回0;
}

编辑:删除了寄存器问题

您不能将“寄存器”用作函数名,因为它是C关键字

  • register
    是一个C关键字:为函数使用另一个名称

  • 在回调参数周围有额外的偏执。应该是:

    void funcName(void (*callback) (void))
    
  • 2个问题:

    • 您不能使用名称
      register
      ,因为它是一个关键字(不再经常使用,但它仍然存在)
    • 将函数的定义从

      void wasRegister((void (*callback) (void)))
      
      致:

      (去掉参数声明周围的参数

    此外,您可能会收到一条关于
    callback\u proc()
    没有与
    callback
    变量匹配的增量的警告(取决于您如何将程序编译为C或C++),因此您可能希望将其声明更改为:

    void callback_proc (void)
    
    明确表示它不需要任何参数。

    请从中查看。公开类型化函数指针供世界使用是一回事,确保正常转换是另一回事。

    \35; include
    
    #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;
    }
    
    typedef void(*回调函数)(void); 静态回调函数\u callback=0; 作废处理(作废) { printf(“内部进程函数\n”); } 无效回调寄存器(回调函数cb) { _回调=cb; printf(“内部注册”); } 无效回调(void) { _回调(); } 内部主(空) { 回调_寄存器(进程);/*传递函数指针*/ 回调(); 返回0; }

    如果此代码是模块化的,那么声明
    回调
    静态将更有意义,然后您将被迫调用
    回调
    以设置它,而
    回调
    以调用它-
    回调
    将无法在实现(.c)之外访问只有函数声明会在标题(.h)中。

    register
    是一个关键字,顺便说一句。你在哪一行发现了错误?只是一个提示:typedefs有助于让事情更可读一些:
    typedef void(*CallbackFunc)(void);
    。然后你的函数签名是
    void registerFunc(CallbackFunc callback)
    您的声明是
    CallbackFunc my\u cb=&callback\u proc
    噢,还有一件事:
    void callback\u proc()
    void callback\u proc(void)不同
    在C.Yep中,很难找到额外的参数。+1 typedef在哪里?这是一个很好的建议,但您的示例缺少它。我看不到typedef?您所做的是定义了一个函数指针,它不是类型安全的。很抱歉,我没有意识到我在复制和粘贴时遇到问题,您答案中的链接已失效。@bummi、 如果Tim决定删除此答案,他将收到一条消息,该帖子已被Tim post删除♦. 要知道您的答案被删除的原因,请使用meta:D
    #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;
    }