Стандарт C специально не поддерживает преобразования между указателями на объекты данных и указателями на функции. GCC и Visual Studio поддерживают это как расширение.
Если вы хотите, чтобы ваша функция соответствовала стандарту (но по-прежнему использовала параметр void *
), вы можете вместо этого передать указатель на указатель функции. Это работает, потому что указатели на функции сами по себе являются обычными объектами, поэтому указатель на указатель функции может быть преобразован в void *
и обратно:
init_struct(struct my_struct *p, void *pfn)
{
PFN_FOO *foo = pfn;
p->pfn = *foo;
}
Затем вызывающий должен создать временный PFN_FOO
объект, на который будет передаваться указатель при вызове:
PFN_FOO fp = &somefunc;
/* ... */
init_struct(p, &fp);