Иногда изучение того, что находится под поверхностью, помогает лучше понять картину.
В C вы можете в значительной степени рассматривать имя функции как указатель на эту функцию. Взгляните на пример ниже
#include <stdio.h>
int main() {
(*printf)("test\n");
return 0;
}
В приведенном выше фрагменте кода мы могли бы просто использовать printf()
вместо (*printf)()
, и на самом деле это обычный способ вызова функции.
Другим примером является библиотечная функция signal () (да, я пользователь FreeBSD), чье определение дано как
void
(*signal(int sig, void (*func)(int)))(int);
Когда вы звоните signal()
, конвенция будет
void
handle(int sig)
{
...
}
int main(int argc, char **argv)
{
(void) signal(SIGUSR1, handle);
...
}
Теперь, вы можете увидеть трюк здесь? Хотя объявлено, что signal()
принимает void (*func)(int)
(т. Е. Указатель на функцию, возвращающую void и принимающую единственный аргумент int), мы передаем имя функции этого типа в качестве второго аргумента signal()
.
Возвращаясь к вашему вопросу, PFUNC
- это псевдоним для указателя на функцию, возвращающую void и принимающую единственный аргумент int. Объявляя callback
как PFUNC callback
, вы говорите своему компилятору, что переменная callback
будет указывать на функцию, которая возвращает void и принимает один аргумент int.
Итак, вы должны иметь
void callback_print(int index) /* now you have a void ()(int) */
{
printf("[callback] index = %d\n", index);
}
, чтобы соответствовать ожидаемому значению вашего задания, выполненного info.callback = callback_print;
.