Ваше явное приведение неверно. Вы приводите к bool *
(указатель на объект типа bool
), когда вам действительно нужно привести к void (*)(bool)
(указатель на функцию принимает bool
и ничего не возвращает). 1
Если вы замените эту строку на
ptr->fchd_ptr = (void (*)(bool)) fchd_ptr;
он будет компилироваться как в C, так и в C ++.
Однако, если это возможно, вам следует попытаться скомпилировать ваш код на C только на C - хотя мы могли бы заставить эту единственную вещь работать, эти два языка не всегда полностью совместимы, и вы можете столкнуться с проблемами в будущем. Как правило, код C можно компилировать отдельно от частей C ++. Если вы используете extern "C"
в заголовочных файлах, вы можете просто связать объекты C ++ и объекты C вместе или оставить часть C в отдельной библиотеке (статической или динамической).
Кроме того, я бы порекомендовал переработать C API, чтобы он действительно брал указатель на функцию на всем протяжении, если это вообще возможно. Псевдоним через void *
уродлив и может привести к некоторым действительно неприятным ошибкам и сбоям, если вы передадите неверный тип указателя.
1 Указатели на функции, как правило, сильно отличаются от указателей на объекты, и это зависит от реализации, разрешено ли вам даже приводить между ними. Здесь вам нужен указатель на функцию, а не указатель на объект (например, bool*
будет указателем на объект типа bool
), чтобы вы могли вызвать его позже. Вы можете видеть в своем примере кода, что void (*fchd_ptr)(bool)
является объявлением переменной, которую вы назначаете, что делает void (*)(bool)
ее типом. Если вы находите запись несколько запутанной, cdecl.org - отличный способ справиться с теми запутанными именами массивов, указателей и указателей на функции, которые происходят из C.