#include 我们在LuaWithCPPTest项目下,查看Source.cpp代码如下: #include #include #include using namespace std; extern "C" { #include #include #include }; void TestLua(); int main() { TestLua(); return 0; } void TestLua() { lua_State *L = luaL_newstate(); luaopen_base(L); // luaopen_table(L); // luaopen_package(L); // luaopen_io(L); // luaopen_string(L); // luaL_openlibs(L); //打开以上所有的lib string str; while (true) { cout << "请输入Lua代码:" << endl; getline(cin, str, '\n'); if (luaL_loadstring(L, str.c_str()) || lua_pcall(L, 0, 0, 0) ) { const char * error = lua_tostring(L, -1) ; cout << string(error) << endl; } } lua_close(L); } 其中,被extern "C"包起来的是lua的主要函数的声明。在C++中,每个嵌入的lua的生命周期与各自的lua_State对象一一对应。通过luaL_newstate()方法,我们便创建了一个lua解释器。随后的几个luaopen_*方法,都是获取相应lua库的使用权,最后通过luaL_openlibs打开所有的有使用权的lua标准库。一切准备就绪后,我们开始接收输入。 image image image 我们通过luaL_loadstring,将所有代码读入lua,并且检查代码是否有语法错误。然后通过lua_pcall,运行代码,将所有的全局变量保存在_G中。通过读取、运行这两步,我们就建立起一个自己的lua解释器了。 将lua作为配置文件 从文件读取lua代码,流程与之前的示例一样,仅是将luaL_loadstring()换成luaL_loadfile()即可。代码如下: string str; while (true) { cout << "输入lua文件路径:" << endl; getline(cin, str, '\n'); if (luaL_loadfile(L, str.c_str()) || lua_pcall(L, 0, 0, 0) ) { const char * error = lua_tostring(L, -1) ; cout << string(error) << endl; return; } } image image 现在,我们在lua中定义变量,并且赋值。然后在c++中取值,运算出结果。在lua文件中,内容如下: image 在c++中,我们获取a,b两个变量的值,然后相加,算出结果: #include #include #include using namespace std; extern "C" { #include #include #include }; void TestLua(); int main() { TestLua(); return 0; } void TestLua() { lua_State *L = luaL_newstate(); luaopen_base(L); // luaopen_table(L); // luaopen_package(L); // luaopen_io(L); // luaopen_string(L); // luaL_openlibs(L); //打开以上所有的lib string str; while (true) { cout << "输入lua文件路径:" << endl; getline(cin, str, '\n'); if (luaL_loadfile(L, str.c_str()) || lua_pcall(L, 0, 0, 0) ) { const char * error = lua_tostring(L, -1) ; cout << string(error) << endl; return; } else { break; } } int a = 0; int b = 0; // 获取a的值 lua_getglobal(L, "a"); if (!lua_isnumber(L, -1)) { cout << "-2 error" << lua_isnumber(L, -1) << lua_isnumber(L, -1) << endl; return ; } a = lua_tonumber(L, -1); // 获取b的值 lua_getglobal(L, "b"); if (!lua_isnumber(L, -1)) { cout << "-1 error" << endl; return ; } b = lua_tonumber(L, -1); cout << "a = " << a << " b = " << b << endl; cout << "a + b = " << a + b << endl; lua_close(L); }C++与Lua交互-山东软件开发
地址:山东省济南市舜耕路泉城公园东门园内向北50米 鲁ICP备07011972号 版权所有2008-2013 新利体育18