2009-05-03 8 views
10

Ejemplo: una función que toma una función (que toma una función (que ...) y una int) y una int.¿Cómo puedo escribir un puntero de función que toma una función de su propio tipo como argumento?

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

explota de forma recursiva, donde (...). ¿Hay alguna razón fundamental por la que esto no se puede hacer o hay otra sintaxis? Me parece que debería ser posible sin un elenco. Realmente estoy tratando de aprobar una mesa de despacho, pero podría resolverlo si pudiera pasar este tipo.

+0

¿Explota de forma recursiva, o interpreta el "..." como una vararg sin que realmente se especifique una arg anterior donde debe comenzar el punto vararg? –

+0

Sé que vi una pregunta AS casi exactamente así, pero no puedo encontrarla. –

+0

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

Respuesta

10

se puede envolver el puntero de función en una estructura:

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

No estoy seguro de si esto es una mejora en la fundición. Sospecho que es imposible sin la estructura porque C requiere tipos para ser definidos antes de ser usados ​​y no hay una sintaxis opaca para typedef.

+0

Es bueno que haya una solución alternativa, triste que no "solo funciona". Ah, legado. : - / – HostileFork

6

Es imposible hacerlo directamente. Sus únicas opciones son hacer que el argumento del puntero a la función acepte argumentos no especificados, o aceptar un puntero a una estructura que contenga el puntero a la función, como Dave suggested.

Cuestiones relacionadas