所以我正在编写一个生成函数的程序。我用GCC嵌套函数模拟lambda表达式。但我遇到了一些奇怪的程序动作。也许我不知道这背后的一些理论,巫婆领导我的程序做一些奇怪的行动。在这里,我编写了非常简单的代码,我指出了下面的问题所在。程序应该只打印N次'1337',但程序只是打印它一次,并变得疯狂。
#include <stdio.h>
#include <stdlib.h>
#define lambda(return_type, function_body) \
({ \
return_type __fn__ function_body \
__fn__; \
})
void init(void (**fn)()){
int num = 1337;
*fn = lambda(void,(){printf("%d\n",num);});
}
int main(){
void (*fn)();
init(&fn);
fn(); // Everything is fine, it prints '1337'
fn(); // It prints '-1869573949' , maybe accessing memory somewhere
fn(); // It does not print anything at all
... // It does not print anything at all
return 0;
}
我想指出如果我改变了
void init(void (**fn)()){
int num = 1337;
*fn = lambda(void,(){printf("%d\n",num);});
}
至
void init(void (**fn)()){
*fn = lambda(void,(){printf("%d\n",1337);});
}
它起作用了,但不能满足我的需要。
我很感激在这个问题上所提供的任何帮助或信息,因为我对此非常感兴趣。
发布于 2014-05-12 10:50:02
正如GCC嵌套函数的文档中所指出的:
如果您试图在包含函数退出后通过它的地址调用嵌套函数,那么所有的地狱都会崩溃。如果您试图在包含作用域级别退出之后调用它,如果它引用了一些不再在作用域中的变量,那么您可能是幸运的,但冒险是不明智的。
换句话说,你在这里试图做的事情--返回一个嵌套函数的引用--并不是真正得到GCC的认可。无论它在多大程度上正确工作,你都会感到幸运,因为GCC并不打算支持这个功能。
https://stackoverflow.com/questions/23615828
复制相似问题