Me sale esta pregunta de este blog chino http://chenyufei.info/blog/2011-02-28/wrap-c-function-closure-gcc-nested-function/ El autor desea utilizar el cierre en el lenguaje c, y encontró que GCC tiene la capacidad de función anidada (y cierre). Por ejemplo:Acerca del wrapper y llame a la función 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;
}
Pero no es solución común. create_wrap_function tiene un formato de función fijo, porque func_t limita el formato.
Como sabemos, Lua tiene cierre, y podría llamar a la función C también. Lo que deseo implementar es: Las funciones que queremos llamar son foo1 y foo2, tienen diferentes tipos de argumentos y valor de retorno.
int foo1(int a) {
...
return intValue;
}
double foo2(char* str, double a) {
...
return dblValue;
}
En cliente C, llamar a la función como:
lua_returnValue returnValue1 = Do_Lua_Wrap(__FILE__, __LINE__, foo1, 1);
lua_returnValue returnValue2 = Do_Lua_Wrap(__FILE__, __LINE__, foo2, "string data", 1.2345);
En el Do_Lua_Wrap, pasará la foo1 y 1 a la función Lua, a continuación, llamar foo1 función como proceso normal. Luego pase el foo2 y un char * y un doble valor a la función Lua, luego llame a la función foo2 como un proceso normal. En la función Lua, podría registrar la información sobre ARCHIVO y LÍNEA y escribir algún registro extra sobre los argumentos de la función.
Pero no tengo idea acerca de cómo escribir la función Do_Lua_Wrap en C y Lua, ¿Es posible?
Si es posible, ¿podría darme algunos consejos?
¡Su respuesta es genial! – sagasw