0

我从这个中文博客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

4

2 回答 2

3

该示例无法运行(意外除外);GCC 生成的代码通过一个寄存器wrapped()访问参数f,该寄存器将在create_wrap_function()调用时设置wrapped();从外部调用时,该寄存器未设置,并且该参数f不再存在。

于 2013-05-28T13:32:41.567 回答
1

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

于 2013-05-28T13:58:30.047 回答