Строго говоря, вы не можете. Преобразование между указателем функции и указателем void
невозможно. void*
никогда не был универсальным типом указателя для указателей функций, только для указателей объектов. Они не совместимы.
На практике любой указатель, скорее всего, будет иметь размер, требуемый адресной шиной системы, поэтому указатели объектов и указатели функций, скорее всего, будут иметь одинаковое представление. Хотя не гарантируется стандартом, и есть некоторые экзотические системы, в которых эта эквивалентность не выполняется. Таким образом, вы можете приводить между void*
и указателем на функцию, но в результате произойдет неопределенное поведение. Вы будете полагаться на системные нестандартные расширения.
Немного лучше было бы использовать тип указателя функции, такой как void (*)(void)
, в качестве общего указателя. Вы можете конвертировать в / из различных указателей функций, что будет зависеть от компилятора (поведение, определяемое реализацией). То есть код по-прежнему будет непереносимым, но, по крайней мере, вы не рискуете аварийно завершить работу программы, вызвав неопределенное поведение.