En GNU C, el resultado es 13. Debido a que se utiliza el enlace estático.
lo contrario, si se utiliza el enlace dinámico, el resultado sería 16.Registro de activación en GNU C (función anidada)
#include <stdio.h>
int h(){
int x = 1;
int g(int z){
return z + x; <------------------ P
}
int f(int y){
int x = y + 1;
return g(x * y);
}
return f(3);
}
int main(){
int a = h();
printf("%d\n", a);
}
En el punto P, Activación de registros es
z = 12
x = 4
y = 3
f y puntero a código F
g y puntero a código g
x = 1
h y puntero al código h
un
principal y puntero al código principal
¿Es eso cierto?
Sin embargo, si la función g vuelve, ¿cómo va?
Se eliminan la activación de gy la activación de la variable z.
Luego en el marco de la pila, se mira el orificio.¿Realmente aparece el orificio?
Y De acuerdo con el bloque En línea, En la función h,
variable x es el bloque más externo. (Significa que el bloque de la función g 'está anidado en el bloque de la variable x) el siguiente bloque externo es la función g, la siguiente función f ... Luego, ¿Funciona el punto de enlace estático f con el puntero de marco de la función g? ¿O el puntero de marco de la función h? ¿Qué pasa con el enlace estático de la función g?
+1 para el concepto. ¡GUAUU! He estado escribiendo el código C desde hace años. Nunca se supo que las funciones anidadas eran posibles. Solo pensé que Pascal y Modula lo tenían. Ignoradme - sonríe ... – itsols
@itsols: Las funciones anidadas no son compatibles con C. Son una extensión de GCC, y notablemente una que funciona en código C pero no en C++. Para una exploración de si son una buena idea, consulte: http://stackoverflow.com/questions/2929281/are-nested-functions-a-bad-thing-in-gcc –
Y NO SON CIERRES. Cuando se devuelve una función que define una función anidada, cualquier puntero a las funciones que define se invalida. Esto limita drásticamente su utilidad. Además, ¡no están implementados en todas las arquitecturas! –