永利最大(官方)网站

在C++应用中通过Luabind使用lua脚本

原创|其它|编辑:郝浩|2009-12-21 10:15:28.000|阅读 1859 次

概述:本文直接介绍用luabind中绑定lua函数的过程,至于luabind、boost和lua的安装,请参考官方网站。

#慧都22周年庆大促·界面/图表报表/文档/IDE/IOT/测试等千款热门软控件火热促销中>>

本文直接介绍用luabind中绑定lua函数的过程,至于luabind、boost和lua的安装,请参考官方网站。

在lua_State函数库中注册函数的步骤为:

1.luabind::open(L)用于打开一个库,多次打开将抛出异常;

2.定义luabind::module(L),然后在[]运算符中把每条def加进去,如果是全局或静态函数,写法为:

def("functionname",&function)

如果有多个函数需要注册,则用逗号连接起来。这些看上去不像C++语法,实际上,它是C++语法的,只不过用了[]运算符,逗号运算符,后边,如果定义了类的成员函数,还要用到“.”运算符,其工作原理是用def函数返回一个scop结构,然后将这个结构通过[]运算符交给由luabind::module(L)定义的临时的module_类型的变量。

以下是luabind sample的hello world程序。

 

extern "C"
{
#include
"lua.h"
#include
"lualib.h"
#include
"lauxlib.h"
}
#include
<iostream>
#include
<luabind/luabind.hpp>

void greet()
{
std::cout
<< "hello world!\n";
}

int add(int a,int b)
{
return a+b;
}

extern "C" int init(lua_State* L)
{
using namespace luabind;
open(L);
module(L)
[
def(
"greet", &greet),
def(
"add",&add)
];
return 0;
}

 

 

 

下边是Luaplus的方法:

缺点是:需要定义一个以LuaState类型的参数,这个参数还无法在C++代码中调用。如果luaplus能省去这个步骤,将善莫大焉。

 

static int greet(LuaState* state)
{
LuaStack args(state);
if (args[1].IsNumber())
{ printf(
"%f ", args[1].GetNumber());

}
return 0;
}
int init(LuaState* pState)
{
LuaObject globalsObj
= (*pState)->GetGlobals();
globalsObj.Register(
"greet", greet);

}

 

 

 

直接使用lua:

比前一种方法更不方便,需要自己从L堆栈中取参数。

 

int Add(lua_State *L)
{
long a,b,c;
a
=lua_tonumber(L,1);
b
=lua_tonumberL,2);
c
=a+b;
print(c);
return 1;
}

int RegFunction()
{
lua_register(L,
"AddP",Add);
return 1;
}

 

 

 

boost内置了一个boost python绑定库,因此在应用程序中集成python环境也很方便,更无额外安装一个pythonbind之类的库了。

另外,luabind默认是打开异常捕获的,当被调用函数抛出异常时,这个异常会被转换成luabind异常,框架程序很可能因此无法捕获到预定义类型的异常,所以建议把关掉luabind异常捕获。只捕获lua异常就够了,例如报告个语法错误或者是空指针,还是很实用的。

 

关闭luabind异常捕获的宏:LUABIND_NO_EXCEPTIONS

 

另外,luabind有充分的测试,这些测试代码都可以在源码中的test目录找到。

本人用lua,luabind,luaplus尝试过多次绑定,也试用过boostpython,虽然boost很大,但用过之后,感觉还是不错的,应用程序通常只用到其中一小部分。

另外还研究过javascript,含googlev8,以后有时间在把心得体会贴出来。本来以为应用程序中集成jsp会更好,因为程序员多啊,但由于各种原因,经过权衡最终还是选择了lua。可能以后某个项目还是会用jsp,毕竟jsp的用户群比lua要大得多。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@hmdbvip.cn

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP
PM娱乐城网络现金网站(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) PM娱乐城最大(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) 永利外围最新(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) 网络权威朗驰娱乐大全(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) 永利真人网上足球(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) 利记最火十大网(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) boyu·博鱼权威网络足球(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新) PM娱乐城网上足球(官方)网站/网页版登录入口/手机版登录入口-最新版(已更新)