我从这个中文博客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,它们具有不同类型的args和返回值。
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 *和一个double值传递给Lua函数,然后像正常进程一样调用foo2函数。 在Lua功能中,它可以记录有关文件和 LINE 的信息 并写一些关于函数参数的额外日志。
但我不知道如何在C和Lua中编写函数Do_Lua_Wrap, 可能吗?
如果可能的话,你能给我一些建议吗?
答案 0 :(得分:2)
你显然对variadic function感兴趣,但问题在于确定推入Lua堆栈的参数类型。我会推荐几种方法:
第一个是包括一个 格式字符串a la printf 家庭或二元包装格式 经常用于更高层次 语言。例如,看一看 在。中使用的格式模式 lpack Lua模块。关键是要 扫描格式字符串 确定了多少和什么样的 提供了论据。
或者,你可以实现一个 variant类型。每个论点 需要被包裹在这样一个 结构体。另外,总数 需要提供论据 作为第一个参数。
最后,您可以将参数传递给两个
数组而不是使用可变参数
功能。第一个阵列会
包含枚举类型
对应于第二个数组中void
*
指针的目标。这种方法需要最多的房子
保留客户端代码,但是
相当干净。指定数组长度或标记的参数
也需要一个或两个数组末尾的值。
希望其中一种方法适合您。就个人而言,我会选择第一个选项并使用lpack代码作为指导。它最接近您问题中指定的函数签名。