Я искал, но не мог найти результаты (моя терминология может быть выключена), так простите мне, если это спросили прежде.
Я задавался вопросом, существует ли простой способ назвать a void*
как функция в C без первого объявления указателя функции и затем присвоения указателя функции адреса;
т.е. принятие, что функция названа, является типом void(void)
void *ptr;
ptr = <some address>;
((void*())ptr)(); /* call ptr as function here */
с вышеупомянутым кодом я получаю ошибку C2066: бросок для функционирования типа недопустим в VC2008
Если бы это возможно, как синтаксис не согласился бы для функций с типами возврата и несколькими параметрами?
Ваше приведение должно быть:
((void (*)(void)) ptr)();
В общем, это можно упростить, создав typedef
для типа указателя функции:
typedef void (*func_type)(void);
((func_type) ptr)();
Я должен, однако, указать, что приведение обычного указателя (указатель на объект) в указатель функции или из него не является строго допустимым в стандарте C (хотя это обычное расширение).
В C ++: reinterpret_cast
Использование reinterpret_cast
избавляет вас от запутанных скобок, а < >
четко отличает тип от самого вызова.
Я ужасно запутался при преобразовании в типы функций. Тип указателя функции проще и удобнее определять:
void *ptr = ...;
typedef void (*void_f)(void);
((void_f)ptr)();