C++调用LUA

Lua的C库可以做为Shared Library调用, 但一般开发游戏时会把Lua的所有源程序都包含在内, 并不把Lua编译成共享库的形式. 因为Lua程序只有100多K, 而且几乎可以在任何编译器下Clean Compile. 带Lua源程序的另一个好处时, 可以随时对Lua本身进行扩充, 增加我们所需的功能。

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);  //返回值现在栈顶
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值