Первая строка определяет xyz
как тип функции, возвращающей void
и принимающей один аргумент типа void*
. На самом деле вы можете опустить имя data
, так как оно ничего не делает.
Поскольку в C нет необработанных типов функций, которые вы можете объявить напрямую, вы можете использовать только указатели на xyz
, так как у вас действительно есть xyz * ptr
.
Чаще всего указатель указывается в typedef:
typedef void (*fptr)(void*);
void call(fptr f, void * arg) { f(arg); }
void some_function(void * data); // whatever
int main()
{
void * p = malloc(8);
call(some_function, p);
}
Во второй строке объявляется функция, которая принимает xyz*
в качестве аргумента и возвращает указатель на struct x
с внешней связью.