私はこの中国のブログからこの質問を受け取ります http://chenyufei.info/blog/2011-02-28/wrap-c-function-closure-gcc-nested-function/ 著者は C 言語でクロージャを使用したいと考えています。 GCCにはネストされた関数(およびクロージャー)の機能があることがわかりました。例えば:
typedef int (*func_t)(int arg);
int foo(int a) {
return a + 1;
}
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;
}
しかし、それは一般的な解決策ではありません。create_wrap_function は、 func_t が形式を制限するため、関数形式が固定されています。
ご存じのとおり、Lua にはクロージャがあり、C 関数も呼び出すことができます。私が実装したいのは、呼び出したい関数は foo1 と foo2 で、引数と戻り値の型が異なります。
int foo1(int a) {
...
return intValue;
}
double foo2(char* str, double a) {
...
return dblValue;
}
C クライアントでは、次のように関数を呼び出します。
lua_returnValue returnValue1 = Do_Lua_Wrap(__FILE__, __LINE__, foo1, 1);
lua_returnValue returnValue2 = Do_Lua_Wrap(__FILE__, __LINE__, foo2, "string data", 1.2345);
Do_Lua_Wrap では、foo1 と 1 を Lua 関数に渡し、通常のプロセスと同様に foo1 関数を呼び出します。次に、foo2 と 1 つの char* と 1 つの double 値を Lua 関数に渡し、通常のプロセスと同様に foo2 関数を呼び出します。Lua 関数では、 FILEとLINEに関する情報をログに 記録し、関数の引数に関する追加のログを書き込むことができます。
しかし、関数 Do_Lua_Wrap を C と Lua で記述する方法がわかりません。可能ですか?
もしよろしければ、アドバイスをいただけないでしょうか?