• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

lua和C++的交互(1)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
/*
以前听的一个故事,当年Java的创造者讲课的时候,一开始先拿一个简单的不能简单的小例子,
不断的扩展,最后成为一个复杂而完美的程序。
一个重要之重要的概念,就是栈。Lua与别的语言交互以及交换数据,是通过栈完成的。
*/
#include <iostream>
using namespace std;

extern "C"   //这部分按C语言进行编译而不是C++
{
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
}

class CLuaFn
{
public:
    CLuaFn(void);
    ~CLuaFn(void);
    
    void Init();    //初始化Lua对象指针参数
    void Close();   //关闭Lua对象指针

    bool LoadLuaFile(const char* pFileName);                                 //加载指定的Lua文件
    bool CallFileFn(const char* pFunctionName, int nParam1, int nParam2);    //执行指定Lua文件中的函数

private:
    lua_State* m_pState;  //这个是Lua的State对象指针,一个lua文件对应一个
};

void CLuaFn::Init()
{
    if(NULL == m_pState)
    {
        m_pState = lua_open();   //返回一个lua对象指针
        luaL_openlibs(m_pState); //加载所有可能用到的Lua基本库,比如加载lua的string库,io库,math库等等等等
    }
}

void CLuaFn:Close()
{
    if(NULL != m_pState)
    {
        lua_close(m_pState);   //关闭lua对象并释放指针
        m_pState = NULL;      
    }
}

/*
加载指定的Lua文件
这里要特别说明一下,因为Lua是脚本语言,加载lua文件本身的时候才会编译
所以在加载文件的时候尽量放在程序的初始化中,因为当你执行luaL_dofile()函数的时候,
Lua会启用语法分析器,去分析你的脚本语法是否符合Lua规则,如果你胡乱的传一个文件过去,
Lua就会告诉你文件语法错误,无法加载。如果你的Lua脚本很大,函数很多,语法分析器会比较耗时,
所以,加载的时候,尽量放在合适的地方,而且,对于一个Lua文件而言,
反复加载luaL_dofile()除了会使你的CPU变热没有任何意义
*/
bool CLuaFn:LoadLuaFile(const char* pFileName)
{
    int nRet = 0;
    if(m_pState == NULL)
    {
        return false;
    }
    nRet = luaL_dofile(m_pState, pFileName);
    if(nRet != 0)
    {
        //lua_tostring(m_pState,-1)-1取m_pState栈顶数据,即错误提示字符串 (-1相对栈顶位置,1相对栈底的绝对位置)
        printf("CLuaFn::LoadLuaFile(%s) is file(%d)(%s)\n", pFileName, nRet, lua_tostring(m_pState,-1));
        return false;
    }

    return true;
}

//执行指定Lua文件中的函数
bool CLuaFn:CallFileFn(const char*pFunctionName, int nParam1, int nParam2)
{
    int nRet = 0;
    if(m_pState == NULL)
    {
        return false;
    }
    lua_getglobal(m_pState, pFunctionName); //验证Lua函数是否在当前加载的Lua文件中,并把指针指向这个函数位置
    lua_pushnumber(m_pState, nParam1);      //压栈操作,把数据压入数据栈
    lua_pushnumber(m_pState, nParam2);
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
c#代码标准化:控件前缀名大全发布时间:2022-07-13
下一篇:
(原創) 如何使用泛型模擬virtual? (C/C++) (template)发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap