Вызов void * как функции без объявления указателя на функцию - PullRequest
11 голосов
/ 14 апреля 2010

Я искал, но не смог найти никаких результатов (моя терминология может быть отключена), так что извините, если меня об этом спрашивали раньше.

Мне было интересно, есть ли простой способ для вызова void* как функции в C без предварительного объявления указателя функции и последующего присвоения указателю функции адреса;

т. при условии, что вызываемая функция имеет тип void(void)

void *ptr;
ptr = <some address>;
((void*())ptr)(); /* call ptr as function here */

с приведенным выше кодом, я получаю ошибка C2066: приведение к типу функции недопустимо в VC2008

Если это возможно, как будет различаться синтаксис для функций с типами возвращаемых значений и несколькими параметрами?

Ответы [ 3 ]

25 голосов
/ 14 апреля 2010

Ваш состав должен быть:

((void (*)(void)) ptr)();

В общем случае это можно упростить, создав typedef для типа указателя функции:

typedef void (*func_type)(void);
((func_type) ptr)();

Однако следует отметить, что приведение обычного указателя (указателя на объект) к указателю на функцию или от нее не является строго допустимым в стандарте C (хотя это общее расширение).

13 голосов
/ 14 апреля 2010

Я ужасно запутался при приведении типов функций. Проще определить тип указателя на функцию:

void *ptr = ...;
typedef void (*void_f)(void);
((void_f)ptr)();
12 голосов
/ 14 апреля 2010

В С ++: reinterpret_cast< void(*)() > (ptr) ()

Использование reinterpret_cast избавляет вас от набора запутанных скобок, а < > четко выделяет тип отдельно от самого вызова.

...