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