2015-04-22 36 views
6

Mi chiedevo come scrivere una funzione che restituisce un puntatore a una funzione che restituisce un puntatore a funzione, senza typedef. Per esempio una funzione che restituisce un puntatore a funzione può essere definire come:Come si dichiara una funzione che restituisce un puntatore a una funzione che restituisce un puntatore a funzione senza utilizzare un typedef in C?

type (*f_name(..))(..){..} 

Quindi questo restituisce un puntatore a una funzione che restituisce un 'tipo', ora come si fa a dichiarare la funzione se il 'tipo' è un puntatore di funzione. Ma siccome il mio supervisore non vuole i typedef usati non posso usarli.

Grazie per l'aiuto che puoi dare.

+0

Basta sostituire 'type' con un puntatore di funzione senza nome. –

+4

Il tuo supervisore non vuole typedef? Che strana idea ... Non è chiaro quello che vuoi. Desideri semplicemente una funzione che restituisca un puntatore a funzione o desideri ricorsivamente funzioni funzione-puntatore-ritorno? Cosa hai provato? – Eregrith

+0

Fallo prima con '' typedef'', poi risolvi il '' typedef''s manualmente. – Philip

risposta

7

Per domande come questa c'è un'utilità elegante chiamata cdecl (http://cdecl.org/) che traduce tra dichiarazioni in inglese e C.

Per esempio

cdecl> declare f as function (int) returning pointer to function (char) returning pointer to function (void) returning long 

dà la risposta

long (*(*f(int))(char))(void) 

e, nell'altra direzione,

cdecl> explain int (*(*g(float))(double, double))(char) 

dichiarare g come funzione (float) ritornando puntatore alla funzione (doppia, doppia) tornando puntatore alla funzione (char) ritornando int

+2

BTW, c'è un'interfaccia web per questo: http: // cdecl.org/ – myaut

+1

Yup, ha appena aggiunto l'URL. Grazie per il testa a testa. – drRobertz

+0

Grazie, questa utility è carina e la risposta data è ciò che stavo cercando. – user3711004

3

Innanzitutto si scrive una funzione prendendo un int e restituisce un galleggiante.

float First(int f) 
{ 
    return (float)f ; 
} 

Poi abbiamo scrivere una funzione di prendere nulla e restituire un puntatore ad una funzione di prendere un int e restituisce un float.
Questo puntatore è dello stesso tipo di First.

float (*Second(void))(int) 
{ 
    float (*f)(int) = First ; 

return f ; 
} 

Infine si scrive una funzione prendendo un char e restituisce un puntatore a una funzione di prendere nulla e restituisce un puntatore a una funzione di prendere un int e restituisce un galleggiante. Questo puntatore è dello stesso tipo di Second.

float (*(*Third(char c))(void))(int) 
{ 
    (void)c ; 
    float (*(*s)(void))(int) = Second ; 

return s ; 
} 

Se si posizionano i prototipi lungo l'un l'altro, la sintassi strano comincia ad avere senso:

float  First     (int) ; 
float ( *Second   (void))(int) ; 
float (*(*Third(char))(void))(int) ; 

L'unica differenza di tornare un puntatore non-funzione è che i parametri puntatori a funzione va alla fine della dichiarazione e delle parentesi:

  type* Name(void) ; 
function_type (*Name(void))(int) ; 
Problemi correlati