我是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;
}
这是什么错误?有人可以帮忙吗?
答案 0 :(得分:19)
register
是一个C关键字:为该函数使用其他名称。
您在回调参数周围有额外的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)中。