Вы не можете сделать это. Преобразование между различными типами функций строго говоря, неопределенное поведение, хотя некоторые компиляторы имеют нестандартные расширения, которые позволяют это в некоторой степени.
Кроме того, void (*fn)()
означает функцию, принимающую любые параметры, которая является устаревшим стилем C и не должна использоваться.
Таким образом, функция sock_yield
должна быть переписана. Если предполагалось принять функцию обратного вызова в качестве параметра, она была написана плохо с самого начала. Он должен иметь указатели на функции одного определенного, указанного формата. Например:
typedef void sock_callback_t (char buf, udp_socket* sock);
int sock_yield(void* s, sock_callback_t* fn);
В качестве альтернативы вы можете написать какой-нибудь хак, где вы конвертируете между указателями на функции и uintptr_t
, но это худшее решение, которое следует использовать, только если вы застряли с плохо написанным API.