LUA和C/C++的沟通桥梁——栈
Lua生来就是为了和C交互的,因此使用C扩展Lua或者将Lua嵌入到C当中都是非常流行的做法。要想理解C和Lua的交互方式,首先要回顾一下C语言是如何处理函数参数的。
C函数和参数
大家知道C语言是用汇编实现的,在汇编语言中可没有函数的概念,与函数对应的是叫做子过程的东西,子过程就是一段指令,一个子过程与它调用的子过程之间通过栈来进行参数的传递交互。在一个子过程在调用别的子过程之前,会按照约定的格式将要调用的子过程需要的参数入栈,在被调用的子过程中,可以按照约定的规则将参数从栈中取出。同理,对于返回值的传递也同样是通过堆栈进行的。C语言约定的参数放入栈中的格式,就是“调用惯例”。C语言的函数原型则决定了压入栈中的参数的数量和类型。
Lua的虚拟堆栈
Lua和C之间的交互巧妙的模拟了C语言的堆栈,Lua和C语言之间的相互调用和访问都通过堆栈来进行,巧妙的解决了不同类型之间变量相互访问的问题。具体的,我们想象如下一个图
由于C和Lua是不同层次的语言,因此C语言的变量和Lua中的变量以及函数不能直接的交互,我们假定C语言和Lua都有自己的“空间(C Space和Lua Space)”。而这两个空间之间的交互就通过上图中的这个虚拟堆栈来解决。为何采用虚拟堆栈的方式来进行交互呢?其目的是在提供强大的灵活性的同时避免交互时两种语言变量类型的组合爆炸。
栈的使用解决了C和Lua之间两个不协调的问题:第一,Lua会自动进行垃圾收集,而C要求显示的分配存储单元,两者引起的矛盾。第二,Lua中的动态类型和C中的静态类型不一致引起的混乱。
LuaAPI第一个程序
/* 下载安装,LuaForWindows软件(http://download.csdn.net/download/ivastest/3713327),安装后,会有../lua5.1/inclue/;../lua5.1/lib/这两文件,也就是我们编程要用的头文件,库文件; 或者,到官网(http://www.lua.org/download.html)下载源代码,自己编译出库文件,百度搜索(vs2012编译使用lua)教程 1.新建,Win32控制台应用程序——空项目, 2.配置,附加包含目录,附加库目录,附加依赖项 */ #include<iostream> using namespace std; #include<lua.hpp> /*#include<lua.hpp>其内容是: extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" } */ //#pragma comment(lib, "lua51.lib") int main() { lua_State *l = luaL_newstate(); luaL_openlibs(l); luaL_dofile(l,"test.lua"); //调试时,test.lua文件要与.cpp文件在同一目录;且test.lua的编码需要为ANSI格式,否则会执行失败(0:成功),(1:失败) printf("%d\n",res);//res:=0(成功),=1(失败) lua_close(l); system("pause"); return 0; } /* test.lua文件内容:print("Hello world, from " .. _VERSION .. "!\n") 输出:Hello world, from Lua 5.1! */