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*/
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top