在词法范围外调用嵌套函数:未定义的行为?

时间:2017-11-24 02:16:17

标签: c gcc

我有一个返回嵌套函数的函数:

typedef int (*fp)();

fp makeCounter(){
  static int i=0;
  fp counter(){
    return i++;
  }
  return counter;
}

int main(){
  fp ctr=makeCounter();
  printf("%d\n",ctr());
}

makeCounter返回一个指向本地定义的嵌套函数的函数指针,对我来说这看起来像是一个未定义的行为。

但是我没有找到明确的确认。在GNU website上,它说:

  

如果你试图在包含函数退出后通过其地址调用嵌套函数,那么所有的地狱都会破裂。如果您尝试在包含范围级别退出后调用它,并且如果它引用了一些不再在范围内的变量,您可能会很幸运,但冒风险并不明智。但是,如果嵌套函数没有引用超出范围的任何内容,那么您应该是安全的。

我的措辞breaks looseshould be safe并不是很畅销。是否对此主题有明确的参考确认?

如果这是一个未定义的行为,无论如何都要解决这个问题?我知道通常我们将局部变量定义为static以允许全局访问,在这种情况下我们可以做类似的事情吗?

编辑我知道它是GNU扩展。问题如上所述。

0 个答案:

没有答案