源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C语言模块回调Lua函数的两种方法

  • 时间:2021-09-20 15:15 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C语言模块回调Lua函数的两种方法
lua和C通过虚拟栈这种交互方式简单而又可靠,缺点就是C做栈平衡稍微会多写一点代码。 今天分享学到的C模块回调Lua函数的两种方法,都是炒冷饭,大侠勿喷。 [b]1. C保存函数对象[/b] C模块可以通过注册表保存Lua里面的对象,等适当时候取出再调用即可。
[u]复制代码[/u] 代码如下:
static int lua_callback = LUA_REFNIL; static int setnotify(lua_State *L) {   lua_callback = luaL_ref(L, LUA_REGISTRYINDEX);   return 0; } static int testnotify(lua_State *L) {   lua_rawgeti(L, LUA_REGISTRYINDEX, lua_callback);   lua_call(L, 0, 0); }
luaL_ref把栈顶的值取出,放到指定的tabel中,然后返回一个索引(目测是数组的index)。 lua_rawgeti把之前保存的function对象取出,再由lua_call调用。
[u]复制代码[/u] 代码如下:
function callback(  )     print "Callback" end cb.setnotify(callback) cb.testnotify()
[b]2. C访问Lua全局环境[/b] 第二种方法更简便,C直接调用Lua中的函数,就像Lua调用C一样
[u]复制代码[/u] 代码如下:
static int testenv(lua_State *L) {   lua_getglobal(L, "defcallback");   lua_call(L, 0, 0); }
该方法的缺点就是如果C模块独立编写,方法名就不太灵活。 用这种方法一般会在Lua端再封装一层,以隔离全局环境。 3. 完整例子 cb.c
[u]复制代码[/u] 代码如下:
#include <stdio.h> #include <stdlib.h> #include "lua.h" #include "lualib.h" #include "lauxlib.h" static int lua_callback = LUA_REFNIL; static int setnotify(lua_State *L) {   lua_callback = luaL_ref(L, LUA_REGISTRYINDEX);   return 0; } static int testnotify(lua_State *L) {   lua_rawgeti(L, LUA_REGISTRYINDEX, lua_callback);   lua_call(L, 0, 0); } static int testenv(lua_State *L) {   lua_getglobal(L, "defcallback");   lua_call(L, 0, 0); } static const luaL_Reg cblib[] = {   {"setnotify", setnotify},   {"testnotify", testnotify},   {"testenv", testenv},   {NULL, NULL} }; int luaopen_cb(lua_State *L) {   luaL_register(L, "cb", cblib);   return 1; }
test.lua
[u]复制代码[/u] 代码如下:
require("cb") function callback(  )   print "Callback" end function defcallback()   print "Predef callback" end cb.setnotify(callback) cb.testnotify() print "Done" cb.testenv()
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部