Как привести указатель void функции в C? - PullRequest
0 голосов
/ 29 июля 2011
#include <stdio.h>

int f() {
  return 20;
}

int main() {
    void (*blah)() = f;

    printf("%d\n",*((int *)blah())());     // error is here ! Need help !
    return 0;
}

Я хочу привести 'blah' обратно к (int *), чтобы я мог использовать его как функцию для возврата 20 в выражении printf. Кажется, не работает. Может кто-нибудь помочь?

Ответы [ 4 ]

3 голосов
/ 29 июля 2011

То, что, по-видимому, делает ваш код, вызывает функцию, на которую указывает blah, затем пытается преобразовать возвращаемое значение void в int *, что, конечно, не может быть сделано.

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

printf( "%d\n" , ((int (*)())blah)() );
3 голосов
/ 29 июля 2011

Как насчет этого?

printf("%d\n",((int (*)())blah)() ); 
1 голос
/ 29 июля 2011

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

int (*blah)() = &f; // I believe the ampersand is optional here

Чтобы использовать его в своем коде, выпросто назовите это так:

printf("%d\n", (*blah)());
0 голосов
/ 29 июля 2011

typedef версия int:

typedef int (*foo)();

void (*blah)() = f;
foo qqq = (foo)(f);

Редактировать: упс забыл дать заявление на печать

printf("%d\n", qqq());
...