Función puntero duda
-
06-07-2019 - |
Pregunta
Por favor dígame ¿qué devolverá la llamada a la función dada y cómo? El código:
typedef struct {
int size;
ptrdiff_t index;
void (*inlet) ();
int argsize;
ptrdiff_t argindex;
} CilkProcInfo;
/*
* Returns a pointer to the slow version for a procedure
* whose signature is p.
*/
/* the function definition is - */
static void (*get_proc_slow(CilkProcInfo *p)) () {
return p[0].inlet;
}
/*The function gets called as -*/
(get_proc_slow(f->sig)) (ws, f);
/*where f->sig is a pointer to CilkProcInfo struct*/
Solución
En su estructura CilkProcInfo
, inlet
es un puntero a una función que toma un número no especificado de argumentos y no devuelve un valor, como void foo ();
.
En la línea
(get_proc_slow(f->sig)) (ws, f);
la llamada get_proc_slow (f- > sig)
devuelve este puntero de función, por lo que es equivalente a
(f->sig[0].inlet) (ws, f);
Entonces, si su f- > sig [0] .inlet
apunta a la función foo ()
, es equivalente a la llamada
foo (ws, f);
Debo admitir que la vacío estático (* get_proc_slow (CilkProcInfo * p)) () {...
es un poco desconocido para mí.
Otros consejos
get_proc_slow () devuelve un puntero de función de tipo void (*) () que luego llama el código. Entonces cuando lo haces:
(get_proc_slow(f->sig)) (ws, f);
Es básicamente lo mismo que hacer:
void (*fptr)() = get_proc_slow(f->sig);
fptr(ws, f);
Parece que es una función que devuelve un puntero a una función cuyo valor de retorno es void
que no tiene parámetros ( void (*) ()
) y que acepta un puntero a una CilkProcInfo struct
como parámetro. Sin embargo, no estoy seguro de por qué necesitarías la construcción p [0] .inlet
. ¿No podría simplemente devolverlo como p- > inlet
?
Ah, sí, y get_proc_slow
es el nombre de la función que devuelve dicho puntero de función.
static void (*get_proc_slow(CilkProcInfo *p)) () {
return p[0].inlet;
}
Lectura desde el nombre, teniendo cuidado con las reglas gramaticales: get_proc_slow
es una función (con enlace interno) que toma un puntero a una estructura CilkProcInfo
y devuelve un puntero a una función que toma argumentos no especificados y no devuelve ningún valor ( void
).
(get_proc_slow(f->sig)) (ws, f);
Esta instrucción llama al get_proc_slow
con un parámetro apropiado ( f- > sig
es un puntero a un CilkProcInfo
) y luego usa el valor de retorno (un puntero a una función) para llamar a esa función con ws
y f
como argumentos.