lua 调用文件中的函数调用_如何正确的在C/C++里调用Lua

4db4f03a654ca83bdb9e17d67059c7b8.png

序言

涉及关键词:WSL 、Lua、GCC 、C/C++

声明:本文不对lua,wsl,gcc的安装配置进行教学。

先来看看百度百科是怎么定义lua的

Lua 是一个小巧的脚本语言。 其设计目的是为了通过灵活嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。

单纯的学习lua并不能完全的发挥lua的作用,lua的一大优点就是能和c/c++无缝连接,而且可以在不需要重复编译c/c++的情况下可以修改lua文件并且起作用,当我们的项目文件很大的时候,使用lua进行项目修改极大的减少了等待时间。

Lua中的栈

lua中的栈是一个很奇特的数据结构,普通的栈只有一排索引,但是在lua中有两排索引,正数1索引的位置在栈底,负数-1索引的位置在栈顶。如下图所示。

4da87706c1ccb54a0f7d836d40acc423.png

根据结构图,我们不需要知道栈的大小,我们就可以确定的栈顶和栈底的位置

  • 当索引是1的时候对应的是栈底
  • 当索引是-1的时候对于的是栈顶。

常用的lua api解释

  1. lua_State* L=luaL_newstate(); luaL_newstate()函数返回一个指向堆栈的指针
  2. lua_createtable(L,0,0);新建并压入一张表
  3. lua_pushstring(L,0,0);压入一个字符串
  4. lua_pushnumber(L,0,0);压入一个数字
  5. lua_tostring(L,1);取出一个字符串
  6. lua_tointeger(L,1);取出数字
  7. double b=lua_tonumber();取出一个double类型的数字
  8. lua_load()函数 当这个函数返回0时表示加载
  9. luaL_loadfile(filename) 这个函数也是只允许加载lua程序文件,不执行lua文件。它是在内部去用lua_load()去加载指定名为filename的lua程序文件。当返回0表示没有错误。
  10. luaL_dofile 这个函数不仅仅加载了lua程序文件,还执行lua文件。返回0表示没有错误。
  11. lua_push*(L,data)压栈,
  12. lua_to*(L,index)取值,
  13. lua_pop(L,count)出栈。
  14. lua_close(L);释放lua资源
  15. lua_getglobal(L, "val");//获取全局变量的val的值,并将其放入栈顶

文件目录结构

e0fb89f2ff75eafbcce52c071ce8b140.png

makefile文件

需要注意的是,在用gcc编译的时候需要加上 -llua -lm -ldl

CC

lua测试代码

name 

示例一:通过c语言读取lua中的变量

#include 

测试结果:

测试是在wsl中进行的

9cc3154264e7a9f9460b53cd3322eb4c.png

这里面需要注意的是,当出现多个lua_getglobal()函数的时候由上到下,依次压入栈,在使用lua_to*(L,index)函数读取栈顶元素的时候,如果每次压入栈的数据类型都不一样,那么在读取的是就要注意读取顺序。

当使用lua_tointegers()的是,返回值类型的long long

#define LUA_INTEGER      long long

当使用lua_tolstring()的时候,返回值类型是const char*

函数原型:

LUA_API 

当使用lua_tonumber()的是,返回值类型是double

函数原型

#define LUA_NUMBER	double

示例二:通过c语言调用lua中的函数

#include 

测试结果:

55b70bcf71706723a8f9ffcf75246b76.png

由结果可以看出来,当调用完lua中的函数以后,会自动清空栈,只保留结果在栈顶。

注意:这个时候我们修改一下lua中的add函数:把2改为4

function 

这时不进行编译,直接再运行一下./main,可以看到这个结果改变了从40变成了60,这是在我们没有进行重复编译的情况下直接产生的变化。

漂亮的证明了lua在c语言里的嵌入特性,lua中的函数就像是文本一样被读取,但是又确实是作为程序被执行。当我们的项目很大的时候,每次编译都需要几十分钟,这个时候如果合理的利用lua特性,仅仅是需要修改lua文件就可以避免这十几分钟的空白时间。

ed96659704338a65cacd0fafee7011b8.png

示例三:在c语言里面调用lua中的table

#include 

测试结果:

6fcec109f6df5a21322580a6d1c5f223.png

在注释中可以看得很清楚,lua_gettable(L,1)获取table对象,同时获取栈顶元素返回到table中查找对应的value,再压入栈中。

所有c语言测试程序:

#include 

希望这篇文章能够帮到正在学习lua的同学。

1bbc40c5630b6c82781e4e197595be92.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值