我从这个中国人那里得到了这个问题 博客http://chenyufei.info/blog/2011-02-28/wrap-c-function-closure-gcc-nested-function/ 作者希望在c语言中使用闭包,他发现GCC有 嵌套函数(和闭包)的能力。 例如:
typedef int (*func_t)(int arg);
func_t create_wrap_function(func_t f) {
int wrapped(int arg) {
// call original function
int val = f(arg);
fprintf(log_func_call, "arg: %d ret: %d", arg, val);
return val;
}
return wrapped;
}
你不应该这样做,至少根据GCC文档:
“如果您尝试通过其后的地址调用嵌套函数 包含功能已退出,所有地狱都会破裂。“
http://gcc.gnu.org/onlinedocs/gcc-4.5.2/gcc/Nested-Functions.html
答案 0 :(得分:3)
该示例无法正常工作(意外除外); wrapped()
中GCC生成的代码通过在f
调用create_wrap_function()
时设置的寄存器访问参数wrapped()
;从外部调用时,该寄存器未设置,参数f
不再存在。
答案 1 :(得分:1)
我不认为C中的封闭是可能的。它与使用模型的堆栈不一致。但你可以通过地址调用嵌套函数,因为它只是一段代码,因此代码可能会遇到它然后因分段错误或其他原因而失败。您是否尝试过使用debuger逐步完成此代码?