Я - новичок к 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;
}
Какова эта ошибка? Кто-либо может помочь?
Я бы порекомендовал использовать 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;
}
EDIT: устранена проблема с регистром
Вы не можете использовать «регистр» в качестве имени функции, так как это ключевое слово C.
2 проблемы:
регистр
как ключевое слово (больше не используется часто, но оно все еще там) измените определение функции с
void wasRegister ((void (* callback) (void)))
на:
void wasRegister (void (* callback ) (void))
(избавьтесь от скобок вокруг объявления параметра.
Также вы можете получить предупреждение о callback_proc ()
, не имеющем соответствующей задержки для callback
переменная (в зависимости от того, как вы компилируете программу - как C или C ++), поэтому вы можете изменить ее объявление на:
void callback_proc (void)
, чтобы явно указать, что она не принимает никаких параметров.
{ {1}}#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
static имело бы больший смысл, если бы этот код был модульным, и тогда вы были бы вынуждены вызвать callback_register
, чтобы установить его, и обратный вызов
, чтобы вызвать его - the_callback
не будет доступен вне реализации (.c), только объявления функций будут в заголовке ( .час).
Посмотрите на безопасные обратные вызовы из ccan . Одно дело - предоставить миру типизированный указатель на функцию, а другое - обеспечить разумное приведение типов.
регистр
является ключевым словом C: используйте другое имя для функции.
У вас есть лишние скобки вокруг параметра обратного вызова. Это должно быть:
void funcName (void (* callback) (void))