Нет, и есть, по крайней мере, одна причина, по которой это усложнит ситуацию, если позволить это. Обычно предполагается, что вложенные функции будут иметь доступ к закрытой области видимости. Это делает так, чтобы «стек» больше не мог быть представлен структурой данных стека. Вместо этого необходимо полное дерево.
Рассмотрим следующий код, который на самом деле компилируется в gcc, как предлагает 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;
}
Я разместил то, что большинство людей ожидало бы напечатать, но на самом деле это напечатано:
expect 9 actual 9.000000
expect 3 actual 3
expect 16 actual 16.000000
expect 9 actual 16.000000
Обратите внимание, что последняя строка вызывает функцию "квадрат", но значение "a", к которому она обращается, было изменено во время вызова оболочки (4). Это связано с тем, что отдельный кадр «стека» не создается для каждого вызова «оболочки».
Обратите внимание, что эти виды вложенных функций на самом деле довольно распространены в других языках, которые поддерживают их, таких как lisp и python (и даже в последних версиях Matlab). Они приводят к некоторым очень мощным функциональным возможностям программирования, но они исключают использование стека для хранения локальных фреймов области видимости.