この中国のブログからこの質問を得るhttp://chenyufei.info/blog/2011-02-28/wrap-c-function-closure-gcc-nested-function/ 著者はC言語でクロージャを使いたいと思っており、GCCはネストされた機能(およびクロージャ)を持つことがわかっています。 例:ラップとコールCの機能について
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です。それらは異なるタイプのargsと戻り値を持っています。 Cクライアントで
int foo1(int a) {
...
return intValue;
}
double foo2(char* str, double a) {
...
return dblValue;
}
、のような関数を呼び出す:
Do_Lua_Wrapでlua_returnValue returnValue1 = Do_Lua_Wrap(__FILE__, __LINE__, foo1, 1);
lua_returnValue returnValue2 = Do_Lua_Wrap(__FILE__, __LINE__, foo2, "string data", 1.2345);
、それは通常のプロセスのようfoo1の関数を呼び出し、次に、Luaの関数にfoo1の1を通過します。 次に、foo2と1つのchar *と1つのdouble値をLua関数に渡し、foo2関数を通常のプロセスのように呼び出します。 Lua関数では、FILEとLINE の情報をログに記録し、関数の引数についての余分なログを書き込むことができます。
しかし、私はDo_Lua_Wrap関数をCとLuaに書く方法について考えていません。 可能でしょうか?
可能であれば、アドバイスをいただけますか?
あなたは答えが素晴らしいです! – sagasw