No, y hay al menos una razón por la que complicar las cosas permitirlo. Generalmente, se espera que las funciones anidadas tengan acceso al alcance adjunto. Esto lo hace para que la "pila" ya no se pueda representar con una estructura de datos de pila. En cambio, se necesita un árbol completo.
Considere el siguiente código que realmente se compila en gcc como sugiere 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;
}
he puesto lo que la mayoría de la gente espera para ser impreso, pero en realidad, esto se imprime:
expect 9 actual 9.000000
expect 3 actual 3
expect 16 actual 16.000000
expect 9 actual 16.000000
en cuenta que la última línea llama a la función "cuadrado", pero el " un "valor al que accede se modificó durante la llamada envoltura (4). Esto se debe a que no se crea un marco de "pila" separado para cada invocación de "envoltorio".
Tenga en cuenta que este tipo de funciones anidadas son bastante comunes en otros lenguajes que las admiten como lisp y python (e incluso versiones recientes de Matlab). Conducen a algunas capacidades de programación funcional muy poderosas, pero impiden el uso de una pila para contener marcos de ámbito local.
Esto realmente no merece una 'respuesta'. "Sí." La advertencia es que la función tiene un alcance, por lo que solo puede referirse a ella por su nombre dentro de la función dada. Sin embargo, aún puede hacer un puntero a la función que lo apunte y arrojar eso a otro lado. –
¡Sí! puede que tengas razón de que realmente no merece una 'respuesta', pero cuando tratamos de resolverla durante horas, buscamos cualquier solución ... Nunca lo he hecho pero estoy pidiendo ayuda para resolver mi problema. .. ¡Gracias! – make
@Conspicuo compilador: puede o no merecer una respuesta, pero la respuesta ciertamente no es un simple "sí". –