Реализация функций обратного вызова в 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
задан Benjamin 12 January 2014 в 17:49
поделиться

6 ответов

Я бы порекомендовал использовать 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: устранена проблема с регистром

3
ответ дан 8 December 2019 в 04:51
поделиться

Вы не можете использовать «регистр» в качестве имени функции, так как это ключевое слово C.

2
ответ дан 8 December 2019 в 04:51
поделиться

2 проблемы:

  • вы не можете использовать имя регистр как ключевое слово (больше не используется часто, но оно все еще там)
  • измените определение функции с

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

    на:

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

    (избавьтесь от скобок вокруг объявления параметра.

Также вы можете получить предупреждение о callback_proc () , не имеющем соответствующей задержки для callback переменная (в зависимости от того, как вы компилируете программу - как C или C ++), поэтому вы можете изменить ее объявление на:

void callback_proc (void)

, чтобы явно указать, что она не принимает никаких параметров.

{ {1}}
0
ответ дан 8 December 2019 в 04:51
поделиться
#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), только объявления функций будут в заголовке ( .час).

0
ответ дан 8 December 2019 в 04:51
поделиться

Посмотрите на безопасные обратные вызовы из ccan . Одно дело - предоставить миру типизированный указатель на функцию, а другое - обеспечить разумное приведение типов.

0
ответ дан 8 December 2019 в 04:51
поделиться
  1. регистр является ключевым словом C: используйте другое имя для функции.

  2. У вас есть лишние скобки вокруг параметра обратного вызова. Это должно быть:

     void funcName (void (* callback) (void)) 
     
19
ответ дан 8 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: