2012-06-14 22 views
29

Myślę, że byłoby łatwiej użyć wskaźników funkcji, jeśli utworzyłem typedef dla wskaźnika funkcji, ale wydaje mi się, że się potknąłem o jakąś składnię lub użycie lub coś o typedef dla wskaźniki funkcji, a ja mógłbym skorzystać z pomocy.Jak utworzyć typedef dla wskaźników funkcji

Mam

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

to w zasadzie to, co usiłuję osiągnąć Jestem raczej nowy programista C, a to rzuca mi zbyt wiele. Co zastępuje <???>?

+3

Twój kod nie może działać, ponieważ jeśli g jest typedef, można” t nazywamy to funkcją. Czy możesz opisać, co konkretnie próbujesz zrobić? – templatetypedef

+0

Naprawdę? Myślałem, że mój szef kazał mi użyć typedef do wykonania tej pracy. Czy możesz osiągnąć coś podobnego za pomocą #Define? – SetSlapShot

+1

Co konkretnie próbujesz zrobić? Nie jest jasne, co próbujesz zrobić. – templatetypedef

Odpowiedz

71

Twoje pytanie nie jest jasne, ale myślę, że warto coś takiego:

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

Możliwe jest również 'typedef' typ funkcji, który jest dość rzadki, ale może być bardziej przejrzysty dla ilustracji:' typedef int g (int); g foo; g * func = &foo; '. Jest to przydatne do deklarowania (niestety nie definiowania) wielu funkcji z tym samym podpisem. –

+2

@JonPurdy sugeruje opublikowanie tego jako odpowiedź –

0

Oryginalny sposób pisania funkcji powrocie wskaźnik funkcji jest

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

Tutaj call jest funkcja, która nie przyjmuje niczego poza zwracaniem wskaźnika funkcji, który pobiera 2 argumenty i zwraca wartość całkowitą. Zwróć uwagę na nawiasy, są one absolutnie konieczne.

Oto kod:

#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

Jak to jest związane z pytaniem? – morty

2

Masz rację. Wskaźnik funkcji może być wygodnie używany do wskazywania różnych funkcji tego samego typu zwrotu i przyjmowania tej samej liczby argumentów. Typy argumentów powinny być zgodne z deklaracją argumentów wskaźnika funkcji.

W twoim przypadku można zdefiniować jako wskaźnik funkcji g:

typedef int (*g)(int); // typedef od wskaźnika funkcji.

g to wskaźnik funkcji dla funkcji zwracającej wartość int i przyjmujący jeden argument int.

Wykorzystanie wskaźnika funkcji może być zilustrowane za pomocą prostego programu poniżej:

#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; 
} 

WYJŚCIE:

result of `my_function_returning_int_and_taking_two_int_arguments` = 5 
result of `my_mul_function` = 6 
Powiązane problemy