Позвоните в пустоту * как функцию без объявления указателя функции

StackOverflow https://stackoverflow.com/questions/2635715

  •  26-09-2019
  •  | 
  •  

Вопрос

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

Мне было интересно, есть ли простой способ назвать 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 (хотя это общее расширение).

Другие советы

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

void *ptr = ...;
typedef void (*void_f)(void);
((void_f)ptr)();

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

Использование reinterpret_cast Сохраняет ваш набор путающих скобок, а < > ясно устанавливает тип кроме самого звонка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top