序言
涉及关键词: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索引的位置在栈顶。如下图所示。
根据结构图,我们不需要知道栈的大小,我们就可以确定的栈顶和栈底的位置
- 当索引是1的时候对应的是栈底
- 当索引是-1的时候对于的是栈顶。
常用的lua api解释
- lua_State* L=luaL_newstate(); luaL_newstate()函数返回一个指向堆栈的指针
- lua_createtable(L,0,0);新建并压入一张表
- lua_pushstring(L,0,0);压入一个字符串
- lua_pushnumber(L,0,0);压入一个数字
- lua_tostring(L,1);取出一个字符串
- lua_tointeger(L,1);取出数字
- double b=lua_tonumber();取出一个double类型的数字
- lua_load()函数 当这个函数返回0时表示加载
- luaL_loadfile(filename) 这个函数也是只允许加载lua程序文件,不执行lua文件。它是在内部去用lua_load()去加载指定名为filename的lua程序文件。当返回0表示没有错误。
- luaL_dofile 这个函数不仅仅加载了lua程序文件,还执行lua文件。返回0表示没有错误。
- lua_push*(L,data)压栈,
- lua_to*(L,index)取值,
- lua_pop(L,count)出栈。
- lua_close(L);释放lua资源
- lua_getglobal(L, "val");//获取全局变量的val的值,并将其放入栈顶
文件目录结构
makefile文件
需要注意的是,在用gcc编译的时候需要加上 -llua -lm -ldl
CC
lua测试代码
name
示例一:通过c语言读取lua中的变量
#include
测试结果:
测试是在wsl中进行的
这里面需要注意的是,当出现多个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
测试结果:
由结果可以看出来,当调用完lua中的函数以后,会自动清空栈,只保留结果在栈顶。
注意:这个时候我们修改一下lua中的add函数:把2改为4
function
这时不进行编译,直接再运行一下./main,可以看到这个结果改变了从40变成了60,这是在我们没有进行重复编译的情况下直接产生的变化。
漂亮的证明了lua在c语言里的嵌入特性,lua中的函数就像是文本一样被读取,但是又确实是作为程序被执行。当我们的项目很大的时候,每次编译都需要几十分钟,这个时候如果合理的利用lua特性,仅仅是需要修改lua文件就可以避免这十几分钟的空白时间。
示例三:在c语言里面调用lua中的table
#include
测试结果:
在注释中可以看得很清楚,lua_gettable(L,1)获取table对象,同时获取栈顶元素返回到table中查找对应的value,再压入栈中。
所有c语言测试程序:
#include