2009-05-03 13 views
10

Przykład: Funkcja, która przyjmuje funkcję (która przyjmuje funkcję (to ...) i int) oraz int.Jak mogę wpisać wskaźnik funkcji, który przyjmuje funkcję własnego typu jako argument?

typedef void(*Func)(void (*)(void (*)(...), int), int); 

To eksploduje rekursywnie, gdzie (...). Czy istnieje podstawowy powód, dla którego nie można tego zrobić, czy też istnieje inna składnia? Wydaje mi się, że powinno być możliwe bez obsady. Naprawdę staram się przekazać tabelę ekspedycyjną, ale mógłbym to rozgryźć, gdybym tylko mógł przekazać ten jeden typ.

+0

Czy eksploduje rekursywnie, czy też interpretuje "..." jako wargę, bez faktycznego określenia poprzedniego argumentu, od którego musi zacząć się punkt vararg? –

+0

Wiem, że widziałem pytanie SO prawie dokładnie takie jak to, ale nie mogę go znaleźć. –

+0

http://stackoverflow.com/q/793449/10396 – AShelly

Odpowiedz

10

Można owinąć wskaźnik funkcji w struct:

struct fnptr_struct; 
typedef void (*fnptr)(struct fnptr_struct *); 
struct fnptr_struct { 
    fnptr fp; 
}; 

Nie jestem pewien, czy jest to poprawa na odlewie. Podejrzewam, że jest to niemożliwe bez struktury, ponieważ C wymaga zdefiniowania typów, zanim zostaną użyte i nie ma nieprzejrzystej składni dla typedef.

+0

Fajnie, że istnieje obejście, smutne, że nie działa "po prostu". Ach, dziedzictwo. : - / – HostileFork

6

Nie można zrobić bezpośrednio. Twoje jedyne opcje to uczynienie argumentu wskaźnikowego funkcji akceptacją nieokreślonych argumentów lub zaakceptowanie wskaźnika do struktury zawierającej wskaźnik funkcji, jako Dave suggested.

// Define fnptr as a pointer to a function returning void, and which takes one 
// argument of type 'pointer to a function returning void and taking 
// an unspecified number of parameters of unspecified types' 
typedef void (*fnptr)(void (*)()); 
Powiązane problemy