zoukankan      html  css  js  c++  java
  • 在C++应用中通过Luabind使用lua脚本(一)

    本文直接介绍用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++代码中使用。 

    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);

    }
      

    luaplus有支持直接注册的方法:

    float Add(float num1, float num2)
    {
        return num1 + num2;
    }

    LuaStateOwner state;
    state->GetGlobals().RegisterDirect("Add", Add);
    state->DoString("print(Add(10, 5))"); 

    但LuaPlus对C++类的支持并不好,有网友编写了一个LuaPlusHelper用于注册C++类,使得C++类注册到State更容易。

    直接使用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要大得多。

    参考网站:

    http://www.lua.org/

    http://sourceforge.net/projects/luabind/

    http://www.boost.org/

    http://luaplus.org

    另外,由于经验有限,若有纰漏,还望各位看官不吝赐教。

  • 相关阅读:
    【2】网站搭建:数据库选型
    【1】网站搭建:模型设计
    输入法评价
    站立会议个人博客六
    站立会议个人博客五
    站立会议个人博客四
    站立会议个人博客三
    第十一周学习进度表
    站立会议个人博客二
    典型用户和用户场景描述。
  • 原文地址:https://www.cnblogs.com/Tue/p/1628562.html
Copyright © 2011-2022 走看看