2012-06-14 14 views
29

Penso che sarebbe più facile usare i puntatori di funzione se ho creato un typedef per un puntatore a funzione, ma mi sembra di essere inciampato su qualche sintassi o uso o qualcosa di typedef per puntatori di funzione, e potrei usare qualche aiuto.Come creare un typedef per i puntatori di funzione

Ho

int foo(int i){ return i + 1;} 
typedef <???> g; 
int hvar; 
hvar = g(3) 

Questo è fondamentalmente quello che sto cercando di realizzare Sono piuttosto nuovo programmatore C e questo mi sta gettando troppo. Cosa sostituisce <???>?

+3

Il codice non può assolutamente funzionare perché se G è un typedef, si puo' Lo chiamo come una funzione. Puoi descrivere cosa stai specificatamente cercando di fare? – templatetypedef

+0

Davvero? Pensavo che il mio capo mi avesse detto di usare un typedef per farlo funzionare. Riuscirai a realizzare qualcosa di simile a #Define? – SetSlapShot

+1

Che cosa stai cercando di fare in particolare? Non è chiaro cosa stai tentando di fare. – templatetypedef

risposta

71

tua domanda non è chiaro, ma credo che si potrebbe desiderare qualcosa di simile:

int foo(int i){ return i + 1;} 

typedef int (*g)(int); // Declare typedef 

g func = &foo;   // Define function-pointer variable, and initialise 

int hvar = func(3);  // Call function through pointer 
+1

È anche possibile 'typedef' il tipo di funzione, che è piuttosto raro, ma può essere più chiaro per l'illustrazione:' typedef int g (int); g foo; g * func = &foo; '. Questo è utile per dichiarare (sfortunatamente, non definire) più funzioni con la stessa firma. –

+2

@JonPurdy suggerisce di postare la risposta come risposta –

0

Il modo originale di scrivere la funzione che restituisce puntatore a funzione è

int (* call(void)) (int,int); 

Qui call è un funzione che non accetta nulla ma restituisce un puntatore a funzione che accetta 2 argomenti e restituisce un valore intero. Prestare attenzione alle parentesi, sono assolutamente necessari.

Ecco il codice:

#include<stdio.h> 

int sum(int a,int b) //sum is the function returned by call 
{ 
    return a+b; 
} 

int (*call(void)) (int ,int); 

int main() { 
    int (*p)(int,int); // way to declare a function pointer 
    p=call(); 
    printf("%d\n",(*p)(8,3)); 
} 

int(*call(void))(int,int) { 
    return sum; 
} 
+0

Come è correlato alla domanda? – morty

2

Hai ragione. Il puntatore della funzione può essere convenientemente utilizzato per indicare le diverse funzioni dello stesso tipo di ritorno e prendendo lo stesso numero di argomenti. I tipi di argomento devono corrispondere alla dichiarazione degli argomenti del puntatore della funzione.

Nel tuo caso si potrebbe definire il puntatore a funzione g come:

typedef int (*g)(int); // typedef del puntatore a funzione.

g è un puntatore di funzione per la funzione che restituisce il valore int e prende un argomento int.

L'utilizzo del puntatore a funzione potrebbe essere illustrato da un semplice programma di seguito:

#include<stdio.h> 

typedef int (*pointer_to_function)(int first_parameter_of_type_int, int second_parameter_of_type_int); 

int my_function_returning_int_and_taking_two_int_arguments(int par1, int par2) 
{ 
    int result = par1 + par2; 
    return result; 
} 

int my_mul_function(int par1, int par2) 
{ 
    int result = par1 * par2; 
    return result; 
} 

int main() 
{ 
    int res; // returning result will be here 
    pointer_to_function my_fun_pointer; // declare function pointer variable; 

    my_fun_pointer = my_function_returning_int_and_taking_two_int_arguments; // function pointer points to `my_function_returning_int_and_taking_two_int_arguments` function 
    res = my_fun_pointer(2,3);  // Call function through pointer 
    printf(" result of `my_function_returning_int_and_taking_two_int_arguments` = %d \n", res); 


    my_fun_pointer = my_mul_function; // now function pointer points to another function: `my_mul_function` 
    res = my_fun_pointer(2,3);  // Call function through pointer 
    printf(" result of `my_mul_function` = %d \n", res); 

    return 0; 
} 

USCITA:

result of `my_function_returning_int_and_taking_two_int_arguments` = 5 
result of `my_mul_function` = 6 
Problemi correlati