【问题标题】:About wrap and call C function关于 wrap 和调用 C 函数
【发布时间】:2011-07-05 21:32:52
【问题描述】:

我从这个中文博客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函数中,可以记录FILELINE的信息 并写一些关于函数参数的额外日志。

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

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

【问题讨论】:

    标签: c lua closures ffi


    【解决方案1】:

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

    1. 首先是包含一个 格式化字符串 a la printf 家庭或二进制包装格式 常用于较高级别 语言。例如,看看 在中使用的格式模式 lpack Lua 模块。关键是 扫描格式字符串到 确定数量和种类 提供了参数。

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      相关资源
      最近更新 更多