2012-01-04 12 views
5

Jak zadeklarować wskaźnik do funkcji zwracającej inny wskaźnik funkcji? Proszę podziel się ze mną składnią i przykładowym fragmentem kodu.Składnia wskaźnika do funkcji zwracającej wskaźnik funkcji w C

Również w jakim scenariuszu wskaźnik funkcji zwracałby wskaźnik funkcji?

+3

Prosimy nie dodawać swoje nazwisko na końcu postów, ponieważ twój podpis pojawi się automatycznie na końcu postów! http://stackoverflow.com/faq#signatures –

+0

Udoskonaliłem tytuł i tekst, aby były bardziej zrozumiałe. Możesz oczywiście go cofnąć, jeśli nie podoba ci się zmiana, ale proponuję, abyś rozważył tę różnicę ostrożnie, ponieważ może to trochę wyjaśnić problem. – dmckee

Odpowiedz

9

To trywialne z typedefs:

typedef int(*FP0)(void); 
typedef FP0(*FP1)(void); 

FP1 jest typu wskaźnik do funkcji, która zwraca wskaźnik funkcji typu FP0.

Co do tego, kiedy jest to przydatne, dobrze, jest użyteczne, jeśli masz funkcję, która zwraca wskaźnik funkcji i musisz uzyskać lub zapisać wskaźnik do tej funkcji.

+0

deklaracja jest w porządku, ale możesz podać mi fragment kodu, który używa wskaźnika funkcji i zwraca wskaźnik Funtion. to pomoże mi zrozumieć jasno. Podaj mi także składnię z i bez typedef .. – vijayanand1231

+0

Typedefs nie zawsze są opłacalne. To znaczy. gdy nie masz kompilatora, który wykonuje aliasy szablonów, i chcesz zwrócić wskaźnik funkcji z szablonu _function, a zwracana sygnatura zależy od argumentu szablonu. (Możesz "obejść to" używając "cechy tożsamości") – sehe

+0

PS. Lub oczywiście późne zwroty w C++ 11 :) 'szablon <...> auto foo() -> int (*) (void)' działałoby dobrze – sehe

5

Jeśli nie używasz typedef, jest to trudne. Na przykład, rozważmy signal() od standardu C:

extern void (*signal(int, void (*)(int)))(int); 

void handler(int signum) 
{ 
    ... 
} 

if (signal(SIGINT, SIG_IGN) != SIG_IGN) 
    signal(SIGINT, handler); 

Korzystanie typedefs, łatwiej jest:

typedef void Handler(int); 
extern Handler *signal(int, Handler *); 

void handler(int signum) 
{ 
    ... 
} 

if (signal(SIGINT, SIG_IGN) != SIG_IGN) 
    signal(SIGINT, handler); 

Zauważ, że dla funkcji signal(), to zwykle wystarczy użyć <signal.h> i niech się martwić o systemie ogłaszając to.

+1

W twoim typedef przykładzie, nie należy definiować Handler'a używając (* Handler), a następnie sygnał jako extern Handler sygnału (int, Handler)? Składnia wskaźnika funkcji w C to bałagan, IMHO, ma dwie odrębne składnie, które działają dokładnie tak samo. – Spidey

+1

@Spidey: prawdopodobnie sugerujesz, że jest to bardziej typowy sposób, ale to, co jest wyświetlane, działa poprawnie. Zaletą jest to, że wskaźnik można zobaczyć w deklaracjach. Obie działają. –

+0

Fajnie. Najbardziej niepokoi mnie to, że (main == & main) jest prawdziwe. Prawdopodobnie jest tak ze względu na zgodność ze starszą bazą kodu, ale gdybym miał zdefiniować standard kodu, byłby to pierwszy punkt, który byłby oczywisty, aby jasno określić, która notacja ma być używana. – Spidey

1

Jeśli nie chcą drugiego typedef,

typedef float(*(*fptr_t)(int))(double) 

to znaczy "declare fptr_t as pointer to function (int) returning pointer to function (double) returning float" (fptr_t: int → (podwójna → float))

+0

Deklaracja wygląda dobrze, ale nie ma pewności co do przypisania i wywoływania funkcji za pomocą tego wskaźnika. Czy to samo, co normalny wskaźnik funkcji wywołujący? Ponadto, pls daje mi fragment kodu, który sprawia, że ​​rozumiem bardzo wyraźnie. – vijayanand1231