关于换行和调用C函数

时间:2011-02-28 16:18:01

标签: c lua closures ffi

我从这个中文博客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, 可能吗?

如果可能的话,你能给我一些建议吗?

1 个答案:

答案 0 :(得分:2)

你显然对variadic function感兴趣,但问题在于确定推入Lua堆栈的参数类型。我会推荐几种方法:

  1. 第一个是包括一个 格式字符串a la printf 家庭或二元包装格式 经常用于更高层次 语言。例如,看一看 在。中使用的格式模式 lpack Lua模块。关键是要 扫描格式字符串 确定了多少和什么样的 提供了论据。

  2. 或者,你可以实现一个 variant类型。每个论点 需要被包裹在这样一个 结构体。另外,总数 需要提供论据 作为第一个参数。

  3. 最后,您可以将参数传递给两个 数组而不是使用可变参数 功能。第一个阵列会 包含枚举类型 对应于第二个数组中void *指针的目标。这种方法需要最多的房子 保留客户端代码,但是 相当干净。指定数组长度或标记的参数 也需要一个或两个数组末尾的值。

  4. 希望其中一种方法适合您。就个人而言,我会选择第一个选项并使用lpack代码作为指导。它最接近您问题中指定的函数签名。