I typedef sono per i wusses. Ecco un metodo meccanico semplice per capire le dichiarazioni pelose:
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.
Quindi, la risposta è nel quartiere di char *(*(*a[N])())();
. Dico "nel vicinato" poiché non viene mai specificato quali argomenti le funzioni assumono.
È una domanda di intervista sgradevole (tipi questo brutto sono IME veramente rari), ma dà all'intervistatore un'idea di quanto bene comprendi i dichiaratori. O quello o erano annoiati e volevano solo vedere se potevano farti chiudere il cervello.
EDIT
La maggior parte di tutti gli altri consiglia di utilizzare typedef. L'unica volta che raccomando di usare typedef è se il tipo deve essere veramente opaco (cioè non manipolato direttamente dal programmatore, ma passato a un'API, un po 'come il tipo FILE). Altrimenti, se il programmatore ha lo scopo di manipolare direttamente oggetti di quel tipo, allora IME è meglio avere tutte quelle informazioni disponibili nella dichiarazione, per quanto brutto possa essere. Ad esempio, qualcosa come
NameFuncPickerPointer a[N];
mi dà alcuna informazione su come effettivamente usoa[i]
. Non so che lo a[i]
sia richiamabile, o che cosa restituisca, o quali argomenti dovrebbe prendere (se ce ne sono), o molto altro. Devo andare a cercare il typedef
typedef char *NameFunc();
typedef NameFunc *NameFuncPicker();
typedef NameFuncPicker *NameFuncPickerPointer;
e da quel puzzle come scrivere l'espressione che in realtà chiama una delle funzioni.Mentre utilizzando la, dichiarazione di non-typedef "nudo", so subito che la struttura della chiamata è
char *theName = (*(*a[i])())();
fonte
2010-02-03 14:57:04
che domanda stupida di intervista. C'è una ragione per Internet. È così che possiamo cercare sintassi arcane quando è necessario e non dover ingombrare il nostro cervello con esso. –
'apt-get install cdecl; echo dichiara una matrice di puntatore alla funzione che restituisce il puntatore alla funzione restituisce il puntatore a char | cdecl; '>>>' char * (* (* var [])())() ' –
@Doug T: Sembra ragionevole per me. Saper affrontare le dichiarazioni complicate è, sfortunatamente, un'abilità molto utile in C. –