Я получил этот вопрос из этого китайского блога 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 и один символ char * и одно двойное значение в функцию Lua, затем вызовите функцию foo2, как обычный процесс.В функции Lua она может регистрировать информацию о FILE и LINE и записывать дополнительный журнал об аргументах функции.
Но я понятия не имею, какнаписать функцию Do_Lua_Wrap на C и Lua, это возможно?
Если возможно, не могли бы вы дать мне несколько советов?