在包含函数退出后通过其地址调用嵌套函数?

时间:2013-05-28 10:35:05

标签: c

我从这个中国人那里得到了这个问题 博客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

2 个答案:

答案 0 :(得分:3)

该示例无法正常工作(意外除外); wrapped()中GCC生成的代码通过在f调用create_wrap_function()时设置的寄存器访问参数wrapped();从外部调用时,该寄存器未设置,参数f不再存在。

答案 1 :(得分:1)

我不认为C中的封闭是可能的。它与使用模型的堆栈不一致。但你可以通过地址调用嵌套函数,因为它只是一段代码,因此代码可能会遇到它然后因分段错误或其他原因而失败。您是否尝试过使用debuger逐步完成此代码?