No, e c'è almeno una ragione per cui complicherebbe le cose per consentirlo. In genere, è previsto che le funzioni annidate abbiano accesso all'ambito che racchiude. Ciò lo rende così che lo "stack" non può più essere rappresentato con una struttura di dati dello stack. Invece è necessario un albero completo.
Si consideri il seguente codice che in realtà compila in gcc come suggerisce KennyTM.
#include <stdio.h>
typedef double (*retdouble)();
retdouble wrapper(double a) {
double square() { return a * a; }
return square;
}
int use_stack_frame(double b) {
return (int)b;
}
int main(int argc, char** argv) {
retdouble square = wrapper(3);
printf("expect 9 actual %f\n", square());
printf("expect 3 actual %d\n", use_stack_frame(3));
printf("expect 16 actual %f\n", wrapper(4)());
printf("expect 9 actual %f\n", square());
return 0;
}
ho messo quello che la maggior parte delle persone si aspettano di essere stampato, ma in realtà, questo viene stampato:
expect 9 actual 9.000000
expect 3 actual 3
expect 16 actual 16.000000
expect 9 actual 16.000000
Si noti che l'ultima riga chiama la funzione "piazza", ma il " un "valore a cui accede è stato modificato durante la chiamata wrapper (4). Questo perché un frame "stack" separato non viene creato per ogni invocazione di "wrapper".
Si noti che questi tipi di funzioni annidate sono in realtà abbastanza comuni in altri linguaggi che li supportano come lisp e python (e anche versioni recenti di Matlab). Portano a funzionalità di programmazione funzionale molto potenti, ma precludono l'uso di uno stack per contenere frame di ambito locali.
fonte
2010-02-13 06:26:08
Questo in realtà non merita una "risposta". "Sì." L'avvertenza è la funzione è scopata, quindi è possibile fare riferimento ad esso solo per nome all'interno della funzione data. Puoi comunque creare un puntatore a funzione che punta ad esso e lanciarlo altrove, comunque. –
Sì! potresti avere ragione che in realtà non merita una "risposta", ma quando cerchiamo di risolvere per ore, cerchiamo qualsiasi soluzione ... Non l'ho mai fatto, ma sto cercando un aiuto per risolvere il mio problema. .. Grazie! – make
Compilatore @Conspicuous: può o non può meritare una risposta, ma la risposta certamente non è un semplice "sì". –