Позвоните в пустоту * как функцию без объявления указателя функции
Вопрос
Я искал, но не смог найти какие-либо результаты (моя терминология может быть выключена), поэтому прости меня, если это спросило раньше.
Мне было интересно, есть ли простой способ назвать 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
Сохраняет ваш набор путающих скобок, а < >
ясно устанавливает тип кроме самого звонка.