关于换行和调用C函数

sag*_*asw 5 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;
}
Run Code Online (Sandbox Code Playgroud)

但这不是常见的解决方案.create_wrap_function具有固定的函数格式,因为func_t限制了格式.

我们知道,Lua已关闭,也可以调用C函数.我想要实现的内容如下:我们要调用的函数是foo1和foo2,它们具有不同类型的args和返回值.

int foo1(int a) {
    ...
    return intValue;
}

double foo2(char* str, double a) {
   ...
   return dblValue;
}
Run Code Online (Sandbox Code Playgroud)

在C客户端中,调用函数如:

lua_returnValue returnValue1 = Do_Lua_Wrap(__FILE__, __LINE__, foo1, 1);
lua_returnValue returnValue2 = Do_Lua_Wrap(__FILE__, __LINE__, foo2, "string data", 1.2345);
Run Code Online (Sandbox Code Playgroud)

在Do_Lua_Wrap中,它会将foo1和1传递给Lua函数,然后像正常进程一样调用foo1函数.然后将foo2和一个char*和一个double值传递给Lua函数,然后像正常进程一样调用foo2函数.在Lua函数中,它可以记录有关FILELINE的信息, 并编写一些关于函数参数的额外日志.

但我不知道如何在C和Lua中编写函数Do_Lua_Wrap,这可能吗?

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

Jud*_*den 2

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

  1. 第一个是包含一个格式字符串,如printf 系列或高级语言中经常使用的二进制打包格式。例如,看一下 lpack Lua 模块中使用的格式模式。关键是扫描格式字符串以确定提供的参数数量和类型。

  2. 或者,您可以实现 变体类型。每个参数都需要包含在这样的结构中。此外,需要提供参数总数作为第一个参数。

  3. 最后,您可以在两个数组中传递参数,而不是使用可变参数函数。void *第一个数组将包含与第二个数组中的指针目标相对应的枚举类型。此方法需要对客户端代码进行最多的维护,但相当干净。还需要指定数组长度的参数或一个或两个数组末尾的标记值。

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