2015-04-22 29 views
6

Zastanawiam się, jak napisać funkcję, która zwraca wskaźnik do funkcji, która zwraca wskaźnik funkcji, bez typedef. Na przykład funkcja, która zwraca wskaźnik funkcji można zdefiniować jako:Jak zadeklarować funkcję, która zwraca wskaźnik do funkcji, która zwraca wskaźnik funkcji bez użycia typedef w C?

type (*f_name(..))(..){..} 

Więc ta zwraca wskaźnik do funkcji, która zwraca „typ”, teraz w jaki sposób zadeklarować funkcję, jeśli „typ” jest wskaźnik funkcji. Ale ponieważ mój przełożony nie chce używać typedefs, nie mogę ich użyć.

Dzięki za pomoc, którą możesz udzielić.

+0

Po prostu zamień "typ" na bezimienny wskaźnik funkcji. –

+4

Twój przełożony nie chce typedefs? Co za dziwny pomysł ... Nie jest jasne, czego chcesz. Czy chcesz po prostu funkcję, która zwraca wskaźnik funkcji, czy też chcesz, aby rekursywnie zwracała funkcje zwracające wskaźnik? Co próbowaliście? – Eregrith

+0

Zrób to najpierw za pomocą '' typedef'', a następnie ręcznie wykonaj '' typedef''. – Philip

Odpowiedz

7

W przypadku takich pytań istnieje sprytne narzędzie o nazwie cdecl (http://cdecl.org/), które tłumaczy deklaracje angielskie i C.

Na przykład

cdecl> declare f as function (int) returning pointer to function (char) returning pointer to function (void) returning long 

daje odpowiedź

long (*(*f(int))(char))(void) 

, a w drugim kierunku,

cdecl> explain int (*(*g(float))(double, double))(char) 

daje

deklaruje jako funkcja g (float) powrocie wskaźnik do funkcji (podwójne, podwójne) powrocie wskaźnik do funkcji (char) powrocie int

+2

BTW, istnieje interfejs WWW dla niego: http: // cdecl.org/ – myaut

+1

Yup, właśnie dodałem adres URL. Dzięki za heads-up. – drRobertz

+0

Dzięki temu narzędzie jest miłe, a podana odpowiedź jest tym, czego szukałem. – user3711004

3

najpierw piszemy funkcję biorąc int i powracający pływaka.

float First(int f) 
{ 
    return (float)f ; 
} 

Następnie piszemy funkcję, która nie przyjmuje niczego i zwraca wskaźnik do funkcji przyjmującej wartość int i zwracającej zmienną.
Ten wskaźnik jest tego samego typu co First.

float (*Second(void))(int) 
{ 
    float (*f)(int) = First ; 

return f ; 
} 

końcu piszemy funkcją robienia char i powrót wskaźnika do funkcji biorąc nic i powrót wskaźnika do funkcji biorąc int i powrót pływaka. Ten wskaźnik jest tego samego typu co Second.

float (*(*Third(char c))(void))(int) 
{ 
    (void)c ; 
    float (*(*s)(void))(int) = Second ; 

return s ; 
} 

Jeśli umieścić prototypy wzdłuż siebie, składnia dziwnie zaczyna sensu:

float  First     (int) ; 
float ( *Second   (void))(int) ; 
float (*(*Third(char))(void))(int) ; 

Jedyna różnica na zwrócenie wskaźnika non-funkcyjny jest to, że parametry wskaźników funkcji iść na koniec deklaracji, a nawiasy:

  type* Name(void) ; 
function_type (*Name(void))(int) ; 
Powiązane problemy