代码之家  ›  专栏  ›  技术社区  ›  Tom Savage

如何共享C++与Lua之间的数据?

  •  2
  • Tom Savage  · 技术社区  · 15 年前

    我一直在寻找教程演示如何使用API与Lua共享C++对象。大多数教程只演示如何导出类。

    我想从非常简单的开始,公开一个变量(比如 int myVar = 5 以这样一种方式,LUA的变化将反映在C++应用程序中。

    有人知道有什么好的教程可以教我怎么做吗?

    3 回复  |  直到 15 年前
        1
  •  3
  •   uroc    15 年前

    正如sbk提到的,您将访问变量作为用户数据的成员:

    print(cside.myVar) -- 5
    

    下面是一些使用LuaAPI执行此操作的示例代码。它很简单,虽然很乏味。您要么想要自己的代码生成器,要么使用类似swig或tolua的东西。++

    /* gcc -o simple simple.c -llua -lm -ldl */
    #include <stdio.h>
    
    #include "lua.h"
    #include "lauxlib.h"
    
    int myVar = 5;
    
    int l_set( lua_State *L )
    {
     const char *key = luaL_checkstring(L, 2);
     int val = luaL_checkint(L, 3);
    
     if (strcmp(key, "myVar") == 0)
      myVar = val;
    }
    
    int l_get( lua_State *L )
    {
     const char *key = luaL_checkstring(L, 2);
    
     if (strcmp(key, "myVar") == 0)
     {
      lua_pushinteger(L, myVar);
      return 1;
     }
    }
    
    int main(int argc, char *argv[])
    {
     const struct luaL_Reg somemt[] =
     {
      { "__index", l_get   },
      { "__newindex", l_set   },
      { NULL, NULL }
     };
    
     lua_State *L = luaL_newstate();
     luaL_openlibs( L );
    
     lua_newuserdata(L, sizeof(void *));
    
     luaL_newmetatable(L, "somemt");
     luaL_register( L, NULL, somemt );
     lua_setmetatable(L, -2);
    
     lua_setglobal(L, "cside");
    
     luaL_dostring(L, "print('from Lua:', cside.myVar)");
     luaL_dostring(L, "cside.myVar = 200");
    
     printf( "from C: myVar = %d\n", myVar );
    }
    
        2
  •  5
  •   sbk    15 年前

    只使用LuaAPI直接修改变量并不是那么简单。您必须创建lua表或用户数据(使用 LuaaEngEngTabe LuaAuxNeUSER数据 分别),然后创建一个元表-在您的情况下,它应该具有 α指数 新西兰 用于读写访问的事件,在这些函数中,您应该按名称匹配变量。手动书写没有乐趣。

    也就是说,很明显您不能在全局lua级别公开一个变量—您应该使它成为表/用户数据的成员。这看起来很像Lua中的类/对象,因此只公开一个变量并不比公开一个类简单。此外,公开函数/方法要简单得多。所以阅读那些关于公开课程的教程肯定会有所帮助。

    但是只使用LuaAPI仍然没有乐趣。别误会我,Lua API是整洁的,很棒的,但是如果你有很多要公开的内容,它会变得非常乏味,最终你要么编写大量无聊的重复性代码来绑定你的类,要么编写某种工具来为你自动完成这项任务(使用大量宏很可能是你的第一个想法,在那里,完成这项任务;)。这些工具已经存在, tolua++ ,请 luabind 可能还有很多其他的。

        3
  •  2
  •   Dirk is no longer here    15 年前

    听起来你想看看 tolua++