Typedefs son para wusses. He aquí un método sencillo, mecánico para averiguar declaraciones peludas:
a -- a
a[N] -- is an N-element array
*a[N] -- of pointers
(*a[N])() -- to functions
*(*a[N])() -- returning pointers
(*(*a[N])())() -- to functions
*(*(*a[N])())() -- returning pointers
char *(*(*a[N])())() -- to char.
Por lo tanto, la respuesta está en el barrio de char *(*(*a[N])())();
. Digo "en el vecindario" ya que nunca se especifica qué argumentos toman las funciones.
Es una pregunta de entrevista desagradable (tipos tan feos que son realmente raros IME), pero le da al entrevistador una idea de qué tan bien entiendes a los declaradores. O eso o estaban aburridos y solo querían ver si podían hacer que tu cerebro se cercenara.
EDITAR
casi todos los demás recomienda el uso de typedef. La única vez que recomiendo usar un typedef es si el tipo está destinado a ser verdaderamente opaco (es decir, no manipulado directamente por el programador, sino pasado a una API, algo así como el tipo de ARCHIVO). De lo contrario, si el programador está destinado a manipular objetos de ese tipo directamente, entonces IME es mejor tener toda esa información disponible en la declaración, por feo que sea. Por ejemplo, algo así como
NameFuncPickerPointer a[N];
me da ninguna información sobre cómo realmente usoa[i]
. No sé si se puede llamar al a[i]
, o lo que devuelve, o qué argumentos debe tomar (si corresponde), o cualquier otra cosa. Tengo que ir a buscar a la typedef
typedef char *NameFunc();
typedef NameFunc *NameFuncPicker();
typedef NameFuncPicker *NameFuncPickerPointer;
ya partir de ese rompecabezas de la manera de escribir la expresión que llama en realidad una de las funciones.Mientras que el uso de la, declaración no typedef'd "desnudo", sé inmediatamente que la estructura de la llamada es
char *theName = (*(*a[i])())();
qué pregunta de entrevista tonta. Hay una razón para internet. Es así que podemos buscar la sintaxis arcana cuando sea necesaria y no tener que saturar nuestro cerebro con ella. –
'apt-get install cdecl; echo declara matriz de puntero a función que devuelve puntero a función que devuelve puntero a char | cdecl; '>>>' char * (* (* var [])())() ' –
@Doug T: Me parece razonable. Saber cómo abordar declaraciones complicadas es, desafortunadamente, una habilidad muy útil en C. –