• 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 通过本文主要向大家介绍了lua调用c函数,lua 函数调用,lua中调用自身函数,lua中调用c函数,lua函数等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

需要考虑的问题:

1. 使用 lua_pcall 可以调用 lua 函数,首先把 lua 函数入栈,然后把参数入栈, lua_pcall(luaState, 参数个数, 返回值个数, 0) ;
2. 为了在事件触发时回调 lua 函数,需要把 lua 函数保存起来,使用 luaL_ref(luaState, LUA_REGISTRYINDEX) 将位于栈顶的 lua 函数保存到 LUA_REGISTRYINDEX 表里面, LUA_REGISTRYINDEX 是一个全局表, luaL_ref 将返回 lua 函数在 LUA_REGISTRYINDEX 表中的位置 nRef ;
3. 使用 lua_rawgeti(luaState, LUA_REGISTRYINDEX, nRef) 获取之前保存的 lua 函数,nRef 是 lua 函数在 LUA_REGISTRYINDEX 表中的位置, lua 函数将被放到栈顶,这时就可以使用 lua_pcall 调用 lua 函数了;
4. 使用 luaL_unref(luaState, LUA_REGISTRYINDEX, nRef) 可以从 LUA_REGISTRYINDEX 表中删除之前保存的 lua 函数;

示例:

int LuaTest::Attach(lua_State* luaState)
{
    if(lua_isfunction(luaState, 1) != 1)
    {
        return 0;
    }
    lua_settop(luaState, 1);
    m_nRef = luaL_ref(luaState, LUA_REGISTRYINDEX);   // 保存到 LUA_REGISTRYINDEX 表
    lua_pushinteger(luaState, nRef);
   
    return 1;
}

int LuaTest::Detach(lua_State* luaState)
{
    m_nRef = luaL_checknumber(luaState, 1);
    luaL_unref(luaState, LUA_REGISTRYINDEX, nRef);    // 从 LUA_REGISTRYINDEX 表中删除
    m_nRef = 0;
   
    return 0;
}

// 事件监听函数
void LuaTest::EventListener(lua_State* luaState)
{
    lua_rawgeti(luaState, LUA_REGISTRYINDEX, m_nRef);  // 从 LUA_REGISTRYINDEX 表中获取
    lua_pushstring(luaState, "参数1");
    lua_pushstring(luaState, "参数2");
    lua_pcall(luaState, 2, 1, 0);               // 调用 lua 函数
    int nRet = luaL_checknumber(luaState, -1);  // 返回值
}
</div>

</div>

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

  • Lua中调用C++函数示例
  • Lua实现split函数
  • C调用lua函数需要考虑的问题
  • Lua实现__add方法重载示例
  • Lua中使用.和:调用函数的区别
  • C语言模块回调Lua函数的两种方法
  • Lua和C语言的交互详解

相关文章

  • Lua中table库函数方法介绍
  • Lua文件读写详解
  • Lua中的协同程序之resume-yield间的数据返回研究
  • Lua教程(二十一):编写C函数的技巧
  • Lua中的文件I/O操作教程
  • Lua中的递归函数写法实例
  • Lua模拟面向对象示例分享
  • Lua读写文件代码示例
  • Lua 数学库的所有函数功能作用一览
  • 使用lua实现split字符串分隔

文章分类

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

最近更新的内容

    • 详解Lua中repeat...until循环语句的使用方法
    • Lua中的动态链接实例
    • Lua模拟面向对象示例分享
    • Lua面向对象之类和继承浅析
    • 实现Lua中数据类型的源码分享
    • 简单谈谈lua和c的交互
    • Lua中的函数浅析
    • 深入探究Lua中的解析表达式
    • 浅析Lua中的迭代器
    • Lua入门学习笔记

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

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