2012-01-04 24 views
5

¿Cómo declarar un puntero a una función que devuelve otro puntero a la función? Por favor, comparta conmigo la sintaxis y un fragmento de código de ejemplo.Sintaxis para un puntero a una función que devuelve un puntero de función en C

Además, ¿en qué escenario se usaría un puntero a la función que devuelve un puntero a la función?

+3

Por favor, no añada su nombre al final de las publicaciones ya que su firma aparecerá al final de las publicaciones automáticamente. http://stackoverflow.com/faq#signatures –

+0

Le pellizqué el título y el texto en un esfuerzo por hacerlos más comprensibles. Por supuesto, puede volver a cambiarlo si no le gustan los cambios, pero le sugiero que considere la diferencia con cuidado ya que podría aclarar un poco el problema. – dmckee

Respuesta

9

Esto es trivial con typedefs:

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

FP1 es el tipo de un puntero a una función que devuelve un puntero a función del tipo FP0.

En cuanto a cuándo es útil, bueno, es útil si tiene una función que devuelve un puntero de función y necesita obtener o almacenar un puntero a esta función.

+0

declaración está bien, pero ¿me puede dar un fragmento de código que utiliza el puntero a la función y devuelve un puntero funtion. eso sería útil para que yo entienda claramente. Además, dame la sintaxis con y sin typedef. – vijayanand1231

+0

Typedefs no siempre son viables. Es decir. cuando no tiene un compilador que haga alias de plantilla, y desea devolver un puntero de función desde una _function template_, y la firma devuelta depende de un argumento de plantilla. (Puede 'solucionarlo' usando un 'rasgo de tipo de identidad') – sehe

+0

PD. O por supuesto, C++ 11 tipos de devolución tardía :) 'template <...> auto foo() -> int (*) (void)' funcionaría muy bien – sehe

5

Si evita usar typedef, es difícil. Por ejemplo, considere signal() de la norma C:

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

void handler(int signum) 
{ 
    ... 
} 

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

Usando typedef, es más fácil:

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

void handler(int signum) 
{ 
    ... 
} 

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

Tenga en cuenta que para la función signal(), que normalmente sólo tiene que utilizar <signal.h> y dejar que el sistema se preocupe declarándolo.

+1

En tu ejemplo typedef, no debería definirse Handler usando (* Handler), y luego señal como señal externa del manejador (int, Handler)? La sintaxis del puntero de función en C es un desastre, en mi humilde opinión, tiene dos sintaxis distintas que funcionan exactamente igual. – Spidey

+1

@Spidey: lo que sugiere es la forma más típica de hacerlo, probablemente, pero lo que se muestra también funciona correctamente. La ventaja es que puedes ver el puntero en las declaraciones. Ambos trabajan. –

+0

Cool. Lo que más me preocupa es que (main == y main) es cierto. Probablemente sea así para la compatibilidad con una base de códigos anterior, pero si tuviera que definir un estándar de código, ese sería el primer punto en el que me aseguraría de especificar qué notación usar. – Spidey

1

Si no desea una segunda typedef,

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

esto significa "declare fptr_t as pointer to function (int) returning pointer to function (double) returning float" (fptr_t: int → (doble → float))

+0

La declaración se ve bien, pero no está seguro acerca de la asignación e invocar la función utilizando este puntero. ¿Es lo mismo que invocar el puntero a la función normal? Además, los pls me dan un fragmento de código que me hace entender muy claramente. – vijayanand1231

Cuestiones relacionadas