我有一个返回嵌套函数的函数:
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 loose
或should be safe
并不是很畅销。是否对此主题有明确的参考确认?
如果这是一个未定义的行为,无论如何都要解决这个问题?我知道通常我们将局部变量定义为static
以允许全局访问,在这种情况下我们可以做类似的事情吗?
编辑我知道它是GNU扩展。问题如上所述。