Назовите пустоту* как функция, не объявляя указатель функции

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

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

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

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

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

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

11
задан Stargateur 27 April 2018 в 07:54
поделиться

3 ответа

Ваше приведение должно быть:

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

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

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

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

25
ответ дан 3 December 2019 в 00:59
поделиться

В C ++: reinterpret_cast (ptr) ()

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

12
ответ дан 3 December 2019 в 00:59
поделиться

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

void *ptr = ...;
typedef void (*void_f)(void);
((void_f)ptr)();
13
ответ дан 3 December 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: