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

1

C でクロージャが可能だとは思いません。スタックを使用したモデルとうまく一致しません。ただし、ネストされた関数は単なるコードであるため、アドレスで呼び出すことができます。そのため、コードが実行され、セグメンテーション違反などで失敗する可能性があります。デバッガーを使用して、このコードを段階的に実行してみましたか?

于 2013-05-28T13:58:30.047 に答える