2010-04-14 2 views
11

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

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

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

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

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

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

ответ

22

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

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

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

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

+0

Только то, что я искал, спасибо. –

12

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

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

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

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