前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Lua和C如何交互(二)

Lua和C如何交互(二)

作者头像
程序手艺人
发布2019-02-21 16:16:35
1.2K0
发布2019-02-21 16:16:35
举报
文章被收录于专栏:程序手艺人程序手艺人

上一篇文章描述了Lua和C交互的原理, 这篇文章主要通过Demo程序加深Lua和C的交互. 涉及到交互,分为:

  • Lua中如何调用C函数
  • C中如何调用Lua函数

这里先描述C中如何调用Lua函数, 想象一下, C到底怎么和Lua进行通信,如何告诉它我调用的是xxx参数?

  • Lua采取的是利用栈进行交互
  • Lua提供了C API对栈进行操作, 利用各种Lua_pushXXX将不同的值压入栈中,然后调用Lua脚本时自然会退栈取出参数运行
  • Lua栈状态需要自己进行维护,若发生多线程同时对Lua栈操作,没有加锁保护的话会导致栈状态混乱
hello.lua
代码语言:javascript
复制
str = "hello world"
-- 定义一个tab
tb = {name = "hello",id = 20180119}   

注意: Lua使用--表示为注释

main.c
代码语言:javascript
复制
#include<lua.h>
#include<lauxlib.h>
#include<lualib.h>

#include<stlib.h>
#include<stdio.h>
int main(void)
{
    char *str;
    lua_State *L;
    int li;
    L = luaL_newstate();                        /* 创建Lua虚拟机*/
    luaL_openlibs(L);                           /* 加载Lua基本库 */
    luaL_loadfile(L, "hello.lua");              /* 加载Lua文件,但是不运行 */
    lua_pcall(L, 0, 0, 0);                      /* 运行Lua文件,参数个数, */
    //luaL_dofile(L,"hello.lua");

    li = lua_gettop(L);                          /* 返回栈顶索引(即栈长度)*/
    lua_getglobal(L,"str");                      /*  获取str的值,压入栈中 */
    str=lua_tostring(L,1);                       /*  出栈,将给定索引处的Lua值转换为C字符串 */
    printf("str = %s\n",str);
}
  • lua_getglobal(L,”str”)
    • 执行两步操作
    • 首先将str放入栈中
    • 然后由Lua去全局表中匹配str的值,并将str的值返回栈顶
  • luaL_dofile(L,”helloscript.lua”);
    • 它是这样子定义的: #define luaL_dofile(L,fn) (LuaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))
    • 相当于luaL_loadfile + lua_pcall,不仅加载而且运行
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年01月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • hello.lua
  • main.c
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档