Вызовите 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 сохраняет набор запутанных круглых скобок, а < > явно устанавливает тип отдельно от самого вызова.