【问题标题】:Push lua function as table member from C API从 C API 推送 lua 函数作为表成员
【发布时间】:2012-08-27 07:20:24
【问题描述】:

那么,将 C 函数作为函数成员或将 C 函数注册为 lua 函数没有问题 lua_register(L, lua_func_name, c_func);

但是如何告诉 lua 我想从 C 传递 luaFoo() 作为“foober”的函数回调参数? lua_pushcfunction - 推送 C 函数,lua_pushstring 只推送纯字符串,所以回调字段变成了字符串,而不是函数。

Lua 代码:

CALLBACKS = {};
FOO = 0;

function luaFoo()
FOO = FOO + 1;
end;

function addCallback(_name, _callback)
CALLBACKS[_name] = _callback;
end;

function doCallback(_name)
CALLBACKS[_name]();
end;

C 代码:

static int c_foo(lua_State* l)
{
  printf("FOO\n");
  return 0;
}

/*load lua script*/;
lua_State* l = /*get lua state*/;
lua_getglobal(l, "addCallback");
lua_pushstring(l, "foober");
//What push for luaFoo()
lua_pushcfunction(l, c_foo);
lua_call(l, 2, 0);

lua_getglobal(l, "doCallback");
lua_pushstring(l, "foober");
lua_call(l, 1, 0);

类似 - 如果我得到已经注册到 lua_register 的 C 函数,如何将它们作为回调参数从 C 传递。所以我们注册 c_foo => c_foo 作为 lua 函数存在, 如何判断我们想要传递 "c_foo" 作为回调函数参数。

【问题讨论】:

    标签: c lua


    【解决方案1】:

    记住:

    function luaFoo()
      ...
    end
    

    相当于这个,在Lua中:

    luaFoo = function()
      ...
    end
    

    因此,您的问题最终归结为“我在全局表中有一个值。我如何将它推入堆栈?”这个值是一个函数的事实是不相关的; Lua 中的函数值与整数值没有区别,整数值与字符串值没有区别。显然你可以用它们不同的事情,但你只是想复制它们。不管值是什么,它的工作原理都是一样的。

    您要查找的函数是lua_getglobal

    至于您的第二个问题,您可以通过以下两种方式之一进行。您可以从全局表中获取您注册的函数值,也可以简单地使用lua_pushcfunction 重新注册它。由于您没有使用 upvalues,因此重新注册它并没有任何缺点。

    哦,还有一件事,关于代码风格。 Lua 不需要 ; 在语句的末尾。你可以这样做(让 C-native 程序员感觉更舒服),但这不是必需的。

    【讨论】:

      猜你喜欢
      • 2012-06-28
      • 2013-03-28
      • 1970-01-01
      • 2016-03-19
      • 2013-02-08
      • 2021-12-09
      • 1970-01-01
      • 2014-09-14
      • 2011-08-11
      相关资源
      最近更新 更多