Lua的C库提供一系列API:
* 管理全局变量
* 管理tables
* 调用函数
* 定义新函数, 这也可以完全由C实现
* 垃圾收集器Garbage collector, 虽然Lua可以自动进行, 但往往不是立即执行的,所以对实时性要求比较高的程序, 会自己调用垃圾收集器
* 载入并执行Lua程序, 这也可以由Lua自身实现
* 任何Lua可以实现的功能, 都可以通过Lua的C API实现, 这对于优化程序的运行速度有帮助. 经常调用的共用的Lua程序片断可以转成C程序, 以提高效率。
下面是c++调用LUA的简单例子
extern "C" {
#include "D:/program/lua-5.1.4/src/lua.h"
#include "D:/program/lua-5.1.4/src/lualib.h"
#include "D:/program/lua-5.1.4/src/lauxlib.h"
}
#pragma comment(lib,"D:/program/lua-5.1.4/bin/lua51.lib")
/* LUA接口声明*/
lua_State* L;
int main ( int argc, char *argv[] )
{
/* 初始化 Lua */
L = lua_open();
/*载入LUA库 */
luaL_openlibs(L);
/* 运行LUA脚本 */
luaL_dofile(L,"test.lua");
/* 清除 Lua */
lua_close(L);
return 0;
}
c++访问LUA变量
比如我们在脚本中有以下定义:
num=100
s="nv"
t={
age=10,
name="hua"
}
我们可以这样来取得一个变量的值:
lua_getglobal(L, "num"); ----获取数值
int var = lua_tonumber(L, -1);
lua_getglobal(L, "s"); ---- 获取字符串
std::string m_string=lua_tostring(L, -1);
lua_getglobal(L, "t"); -----获取table
lua_pushstring(L,"age");
lua_gettable(L,-2);
int age=lua_tonumber(L, -1);
lua_getglobal(L, "t"); -----获取table
lua_pushstring(L,"name");
lua_gettable(L,-2);
std::string name=lua_tostring(L, -1);
在程序中调用脚本的函数
假设你在脚本中定义了一个函数:
function main(number)
number = number + 1
return number
end
在Lua中,函数等同于变量,所以你可以这样来取得这个函数:
lua_getglobal(L, "main"); //函数现在栈顶。我们可以调用这个函数,并传递给它正确的参数
lua_pushnumber(L, 100); //将参数压栈
lua_pcall(L, 1, 1, 0); //调用函数,有一个参数,一个返回值
int result = lua_tonumber(L, -1); //返回值现在栈顶