您身边的App定制专业企业--10年开发经验为您护航

18678812288
0531-88887250

C++与Lua交互-山东App开发

文章编辑:2138com太阳集团 时间:2016年11月08日

  大家在LuaWithCPPTest项目下,查看Source.cpp代码如下:

  #include <iostream>

  #include <fstream>

  #include <string>

  using namespace std;

  extern "C"

  {

  #include <lua.h>

  #include <lauxlib.h>

  #include <lualib.h>

  };

  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 <iostream>

  #include <fstream>

  #include <string>

  using namespace std;

  extern "C"

  {

  #include <lua.h>

  #include <lauxlib.h>

  #include <lualib.h>

  };

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

  }


想要了解更多详情欢迎来电咨询18678812288
登陆网址:www.jnydkj.cn。
联系人:王经理。

XML 地图 | Sitemap 地图