• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Lua > C语言模块回调Lua函数的两种方法

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

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了c语言调用lua,lua c模块,c lua,lua调用c函数,lua调用c等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

lua和C通过虚拟栈这种交互方式简单而又可靠,缺点就是C做栈平衡稍微会多写一点代码。 今天分享学到的C模块回调Lua函数的两种方法,都是炒冷饭,大侠勿喷。

1. C保存函数对象

C模块可以通过注册表保存Lua里面的对象,等适当时候取出再调用即可。
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);
}
</div>
luaL_ref把栈顶的值取出,放到指定的tabel中,然后返回一个索引(目测是数组的index)。 lua_rawgeti把之前保存的function对象取出,再由lua_call调用。
function callback(  )
    print "Callback"
end

cb.setnotify(callback)
cb.testnotify()
</div>
2. C访问Lua全局环境
第二种方法更简便,C直接调用Lua中的函数,就像Lua调用C一样
static int testenv(lua_State *L)
{
  lua_getglobal(L, "defcallback");
  lua_call(L, 0, 0);
}
</div>
该方法的缺点就是如果C模块独立编写,方法名就不太灵活。 用这种方法一般会在Lua端再封装一层,以隔离全局环境。

3. 完整例子
cb.c
#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;
}
</div>
test.lua
require("cb")

function callback(  )
  print "Callback"
end

function defcallback()
  print "Predef callback"
end

cb.setnotify(callback)
cb.testnotify()
print "Done"
cb.testenv()
</div>

</div>

您可能想查找下面的文章:

  • Lua编程示例(七):协同程序基础逻辑
  • 使用Lua作为C语言项目的配置文件实例
  • C语言中调用Lua函数实例
  • C语言模块回调Lua函数的两种方法
  • Lua与C语言间的交互实例
  • C语言中通过LUA API访问LUA脚本变量的简单例子
  • Lua和C语言的交互详解

相关文章

  • Lua中的模块与module函数详解
  • Lua教程(二十一):编写C函数的技巧
  • Lua下基本的网络编程示例
  • C++中调用Lua配置文件和响应函数示例
  • Lua教程(十): 全局变量和非全局的环境
  • Mac平台中编译安装Lua运行环境及Hello Lua实例
  • Redis教程(三):List数据类型
  • Lua中的协同程序详解
  • Lua学习笔记之表和函数
  • Lua中的操作符和表达式总结

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Lua之wrap函数用法示例
    • Lua教程(八):数据持久化
    • Lua变量类型简明总结
    • Lua中获取utf8字符串长度的方法和自定义函数
    • Lua中的__index方法详解
    • Lua中的递归函数写法实例
    • Lua中实现StringBuffer功能
    • 理解Lua中的__index和__newindex
    • Lua教程(二十二):userdata
    • Lua教程(十): 全局变量和非全局的环境

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有