lua和C++的交互(1)
/* 以前听的一个故事,当年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); }