2010-01-13 20 views
11

Estoy tratando de entender lo que la siguiente línea del código C grave de la historia-visto (de uboot proyecto) significa:C - ¿Qué significa esta línea?

rc = ((ulong (*)(bd_t *, int, char *[]))addr) (bd, --argc, &argv[1]); 

¿Qué es? Una llamada de función? ¿Puede ser más legible?

Gracias de antemano por su ayuda!

+0

¿Puede decirnos el tipo declarado de las diferentes variables presentes en esta línea? –

+3

¿Puede ser más legible? ¡No! Ofuscarlo! –

+0

@David: Lo siento, pero no tengo ni idea. Acabo de abrir este proyecto y estoy tratando de entender qué es qué. – psihodelia

Respuesta

34

Sí, es una llamada a función.

Se arroja el valor en addr a un puntero de función que acepta (bd_t *, int, char *[]) como argumentos y devuelve ulong, y llama a la función. Se podría azucarada en:

typedef ulong (*bd_function)(bd_t *bd, int argc, char *argv[]); 

bd_function bdfunc = (bd_function) addr; 

rc = bdfunc(bd, --argc, &argv[1]); 

Esto podría ser excesiva, la introducción de un typedef si esto sólo ocurre una vez, pero creo que ayuda mucho a ser capaz de mirar el tipo del puntero de función por separado.

+7

Dado que typedef hace que la cosa sea legible, no es excesivo. –

+1

No es excesivo de la misma manera que los anitbiotics no son una reacción exagerada a la infección. –

12

Proyecta addr a un puntero de función que acepta (bd_t *, int, char *[]) como argumentos y devuelve un long, a continuación, lo invoca con los argumentos (bd, --argc, &argv[1]).

+0

Derecha. Y para responder la segunda pregunta, no, no se puede hacer más legible. – jason

+3

@Jason: Claro que puede (y debería), ver la respuesta de desenrollar. –

+3

encogimiento de hombros. Para un programador de C es perfectamente legible. –

2

ulong (*)(bd_t *, int, char *[]) es el tipo de una función que toma un puntero a una bd_t, un int, y un puntero a una matriz char, y devuelve un ulong.

El código está lanzando addr a tal función, y luego llamar con bd, --argc y &argv[1] como parámetros, y asignar el resultado a rc.

1

Está encasillando "addr" a un puntero a una función que devuelve un ulong que toma un bd_t *, un int y un char * [] como parámetros, y luego llama a la función con los parámetros bd, --argc , & argv [1].

2

addr debe ser la ubicación en la memoria a una función que se parece a

ulong *funcname(bd_t*, int, char*[]) 

y está siendo llamado con los paramerers como

rc = funcname(bd, --argc, &argv[1]); 
4
No

una respuesta directa a su pregunta, pero podría ser de interés:

Start en el nombre de la variable (o más interna construir si ningún identificador está presente. Mire a la derecha sin saltar sobre un paréntesis a la derecha; di lo que ver. Mire a la izquierda nuevamente sin saltar sobre un paréntesis; di lo que ves Salte un nivel de paréntesis si cualquiera. Mira bien; di lo que ves Mira a la izquierda; di lo que ves Continúe de esta manera hasta que diga el tipo de variable o tipo de devolución.

+0

¿Podría el infractor por favor dejar un comentario. Gracias. –

+0

LOL. buen consejo :) – psihodelia

Cuestiones relacionadas