所以我正在编写一个生成函数的程序。我用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);});
}
它有效,但它不能满足我的需求。
我感谢任何有关此问题的帮助或信息,因为我对此非常感兴趣。
答案 0 :(得分:1)
正如GCC嵌套函数的文档中所述:
如果你试图在包含函数退出后通过其地址调用嵌套函数,那么所有的地狱都会破裂。如果你试图在一个包含的范围级别退出后调用它,并且如果它引用了一些不再在范围内的变量,那么你可能会很幸运,但是承担风险并不明智。
换句话说,你在这里尝试做的事情 - 返回对嵌套函数的引用 - 并不是GCC真正批准的。无论它在何种程度上正常工作,您都会变得幸运,因为GCC并不意味着支持这一功能。