【发布时间】:2010-06-05 12:11:13
【问题描述】:
我刚刚发现 ANSI(ISO) 不允许函数嵌套。 我想知道是什么让 gnu c i 实现了这个功能(为什么会出现这种需要)。
如果函数 say(a()) 在另一个函数 say(b()) 中定义,则 a() 的生命周期会是整个程序吗?
a() 的存储是否会在分配给函数 b() 的堆栈中创建?
【问题讨论】:
我刚刚发现 ANSI(ISO) 不允许函数嵌套。 我想知道是什么让 gnu c i 实现了这个功能(为什么会出现这种需要)。
如果函数 say(a()) 在另一个函数 say(b()) 中定义,则 a() 的生命周期会是整个程序吗?
a() 的存储是否会在分配给函数 b() 的堆栈中创建?
【问题讨论】:
我相信http://en.wikipedia.org/wiki/Nested_function 回答了您的大部分问题 #1。问题 #2 在 http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html 中有更详细的说明,问题 #3 在 http://gcc.gnu.org/onlinedocs/gccint/Trampolines.html 中有更详细的说明。
编辑:(旁白)*的文章莫名其妙地将 PL/M 排除在其支持嵌套函数的基于 ALGOL 的语言列表之外。啊,过去的美好时光。
【讨论】:
1) 高度主观。一点头绪都没有。 :-)
2) 不,内部函数的生命周期仅限于外部函数的生命周期。请参阅GCC documentation on nested functions。如果你保留一个指向内部函数的指针,并在外部函数返回后调用它,可能会发生坏事。
3) 内部函数分配自己的堆栈空间,就像任何其他函数一样。它必须分配自己的空间以支持递归调用。
【讨论】: