void (*func)(int(*[ ])());
Respuesta
No es una declaración, es una declaración.
Declara func
como un puntero a una función que devuelve nulo y teniendo un solo argumento de tipo int (*[])()
, que en sí es un puntero a un puntero a una función que devuelve un entero y teniendo un número fijo, pero indeterminado de argumentos.
salida cdecl para hombres de poca fe:
cdecl> explain void (*f)(int(*[ ])());
declare f as pointer to function (array of pointer to function returning int) returning void
"número de argumentos fijo pero no especificado" - la pregunta también está etiquetada C++, en cuyo caso ese segundo tipo de función toma precisamente cero argumentos. –
La etiqueta C++ fue agregada por alguien que no sea el cartel original, después de haber respondido. Un movimiento demasiado inteligente a la mitad, según mi libro. – caf
Gosh, eso es astuto. Nunca está claro cuando alguien dice "C/C++" si lo han dicho porque piensan que la respuesta es la misma para ambos idiomas, porque piensan que las respuestas son diferentes entre los dos ... –
void (*func)(blah);
es un puntero a una función de tomar blah
como argumento, donde blah
sí se int(*[ ])()
es una matriz de punteros de función.
He aquí una guía de lectura de declaraciones de C:
http://www.ericgiguere.com/articles/reading-c-declarations.html
El procedimiento general para la lectura declaradores peludas es encontrar el identificador de más a la izquierda y su forma de trabajo, recordando que []
y ()
se unen antes de *
(es decir, , *a[]
es una matriz de puntero, no un puntero a una matriz). Este caso se hace un poco más difícil por la falta de un identificador en la lista de parámetros, pero de nuevo, []
se une antes de *
, por lo que sabemos que *[]
indica una matriz de poitners.
Por lo tanto, dado
void (*func)(int(*[ ])());
lo rompemos la siguiente manera:
func -- func
*func -- is a pointer
(*func)( ) -- to a function taking
(*func)( [ ] ) -- an array
(*func)( *[ ] ) -- of pointers
(*func)( (*[ ])()) -- to functions taking
-- an unspecified number of parameters
(*func)(int(*[ ])()) -- returning int
void (*func)(int(*[ ])()); -- and returning void
Lo que esto podría ser en la práctica sería algo así como lo siguiente:
/**
* Define the functions that will be part of the function array
*/
int foo() { int i; ...; return i; }
int bar() { int j; ...; return j; }
int baz() { int k; ...; return k; }
/**
* Define a function that takes the array of pointers to functions
*/
void blurga(int (*fa[])())
{
int i;
int x;
for (i = 0; fa[i] != NULL; i++)
{
x = fa[i](); /* or x = (*fa[i])(); */
...
}
}
...
/**
* Declare and initialize an array of pointers to functions returning int
*/
int (*funcArray[])() = {foo, bar, baz, NULL};
/**
* Declare our function pointer
*/
void (*func)(int(*[ ])());
/**
* Assign the function pointer
*/
func = blurga;
/**
* Call the function "blurga" through the function pointer "func"
*/
func(funcArray); /* or (*func)(funcArray); */
+1 para tratar de explicar cómo leer tales expresiones y ejemplos. –
+1, nice one :) –
+1 para el bloque de análisis al principio. ¡Bonito! –
Geordi
es un bot C++, lo que permite entrenar esto:
<litb> geordi: {} void (*func)(int(*[ ])());
<litb> geordi: -r << ETYPE_DESC(func)
<geordi> lvalue pointer to a function taking a pointer to a pointer to a nullary function
returning an integer and returning nothing
Se pueden hacer muchas cosas útiles, como mostrar todos los parámetros-declaraciones (Esto, de hecho, es sólo coincidencia de nombres de primas C++
regla gramatical):
<litb> geordi: show parameter-declarations
<geordi> `int(*[ ])()`.
Vamos a hacerlo en la dirección opuesta:
<litb> geordi: {} int func;
<litb> geordi: make func a pointer to function returning void and taking array of pointer to
functions returning int
<litb> geordi: show
<geordi> {} void (* func)(int(*[])());
Ejecuta todo lo que le dé, si lo solicita. Si usted está capacitado, sino simplemente olvidado algunas de las reglas paréntesis de miedo, también se puede mezclar C++ y descripciones de los tipos de estilo Geordi:
<litb> geordi: make func a (function returning void and taking (int(*)()) []) *
<geordi> {} void (* func)(int(*[])());
Que se diviertan!
- 1. puede alguien explicar la diferencia
- 2. ¿Puede explicar el uso de sys.sp_addextendedproperty en el siguiente código?
- 3. Eclipse "Establecer declaración siguiente"
- 4. favor explicar el significado de la siguiente conversión
- 5. Equivalente Razor Sintaxis de la siguiente declaración?
- 6. ¿Alguien puede explicar la declaración de estos métodos genéricos de Java?
- 7. ¿Alguien puede explicar OAuth?
- 8. ¿Alguien puede explicar esta sintaxis?
- 9. ¿Alguien puede explicar Microsoft Unity?
- 10. ¿Alguien puede explicar la paradoja Class.superclass.class.superclass?
- 11. ¿Alguien puede explicar el attr?
- 12. plantilla ¿Vínculo externo? ¿Alguien puede explicar esto?
- 13. ¿Puede explicar onCreate and Bundles?
- 14. ¿Puede alguien explicarme la siguiente expresión de Haskell
- 15. ¿Puede el compilador eludir la siguiente copia?
- 16. Cómo explicar esta declaración de método Objective C "- method: parameter;"
- 17. ¿Alguien puede explicar cómo funciona esto?
- 18. ¿Puede alguien explicar esta sintaxis de declaración del método Objective C?
- 19. ¿Puede alguien explicar este uso C++ referencia
- 20. ¿Alguien puede explicar el eclipse.p2.profile
- 21. ¿Alguien puede explicar esto: 0.2 + 0.1 = 0.30000000000000004?
- 22. ¿Puede alguien explicar Cursor en Android?
- 23. ¿Qué es call/cc?
- 24. ¿Puede alguien explicar la forma correcta de usar SBT?
- 25. ¿Qué significa CC? = En un Makefile?
- 26. if (NSOrderedAscending == result) alguien puede explicar esto
- 27. ¿Alguien puede explicar que debe anular?
- 28. ¿Alguien puede explicar cómo usar FastTags
- 29. ¿Alguien puede explicar el archivo Spring web.xml?
- 30. ¿Alguien puede explicar mappedBy in hibernate?
Ver http: // stackoverflow.com/questions/1448849/how-to-understand-complicated-function-declarations – pmg