【问题标题】:nested function嵌套函数
【发布时间】:2010-06-05 12:11:13
【问题描述】:
  1. 我刚刚发现 ANSI(ISO) 不允许函数嵌套。 我想知道是什么让 gnu c i 实现了这个功能(为什么会出现这种需要)。

  2. 如果函数 say(a()) 在另一个函数 say(b()) 中定义,则 a() 的生命周期会是整个程序吗?

  3. a() 的存储是否会在分配给函数 b() 的堆栈中创建?

【问题讨论】:

    标签: c function nested


    【解决方案1】:

    我相信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 的语言列表之外。啊,过去的美好时光。

    【讨论】:

      【解决方案2】:

      1) 高度主观。一点头绪都没有。 :-)

      2) 不,内部函数的生命周期仅限于外部函数的生命周期。请参阅GCC documentation on nested functions。如果你保留一个指向内部函数的指针,并在外部函数返回后调用它,可能会发生坏事。

      3) 内部函数分配自己的堆栈空间,就像任何其他函数一样。它必须分配自己的空间以支持递归调用。

      【讨论】:

      • 2) 不,内部函数的生命周期仅限于外部函数的生命周期,是的,但是内部函数的分配应该在外部函数的堆栈中,这样当外部函数返回时然后分配给外部函数的整个堆栈框架被破坏,因此内部函数的堆栈也被破坏。
      • @user359179:从外部函数返回时,不能从内部函数分配堆栈帧,因为这意味着内部函数尚未返回,您只能从外部函数,这意味着你还不能从它返回。