c语言怎么调用lua库函数,在C语言中调用lua实现的回调函数

这篇博客介绍了如何在内嵌的Lua代码中实现回调函数的保存和调用。通过C代码展示了`save_callback`和`invoke_callback`函数的实现,利用lua_ref保存回调函数和参数的引用,确保在后续任意时刻能够正确回调并传递参数。博客强调了lua_ref的使用细节,并提醒在实际应用中应注意引用的释放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在内嵌的lua代码中,想要实现以下功能:

function callback(n)

print("function callback " .. n);

end;

save_callback(callback, "aaa")

invoke_callback() -- 这里打印出function callback aaa

save_callback(function(n)

print("anonymous function callback " .. n);

end

, 1)

invoke_callback() -- 这里打印出anonymous function callback 1

即:save_callback函数传入回调函数对象和1个参数,然后在任意时刻使用保存的参数和函数对象进行回调。

以下是实现的C代码:

#include

#include

int callback_indicie;

int param_indicie;

/* by superarhow, 2014/03/04 */

int save_callback(lua_State* L)

{

param_indicie = lua_ref(L, 1);

callback_indicie = lua_ref(L, 1);

return 0;

}

int invoke_callback(lua_State* L)

{

lua_getref(L, callback_indicie);

lua_getref(L, param_indicie);

int ret = lua_pcall(L, 1, 0, 0);

if (ret != 0) {

lua_error(L);

}

return 0;

}

int main(int argc, char** argv)

{

lua_State* lua = lua_open();

luaL_openlibs(lua);

lua_register(lua, "save_callback", save_callback);

lua_register(lua, "invoke_callback", invoke_callback);

luaL_dofile(lua, "test.lua");

lua_close(lua);

return 0;

}

注意:

* 因为是例子程序所以用全局变量来保存回调函数和其参数的索引,实际应用中应与其对象关联。可以用C closure实现关联对象,也可以往lua_State中存入全局light userdata指针;

* 注意lua_ref这个函数:lua_ref(L, 1) -> 这里的1不是栈索引,而是指"是否加锁",0为不加锁,非0为加锁。偶使用的版本还不支持不加锁。

另外,lua_ref是luaL_ref的简化版本,luaL_ref要求提供一个table指出ref之后的变量应该保存在哪个位置(否则的话你就再也找不到它了。什么?用栈索引?要知道lua为每次函数调用都新分配了一个栈的,因此在离开作用域之后,栈索引就失效了。)lua_ref使用全局table LUA_REGISTRYINDEX来存放ref。它假设你不会对LUA_REGISTRYINDEX这个table进行增删改的操作,因此返回的这个索引(指向在LUA_REGISTRYINDEX表中的array part部份的位置)是一直有效的。

既然没有提供栈索引,那么它是对哪个对象创建引用?它会对栈尾(最后一个入栈的)对象增加引用计数,保并且会pop掉它。会不会破坏栈平衡?前面已经说过lua会为每次函数调用分配一个新的栈,因此只要这个函数内没有后续操作就可以不用管它。

* 例子中没有调用lua_unref。实际使用时要在使用完毕后调用lua_unref释放掉这些引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值