如何在C ++和Lua之间共享数据?

时间:2009-09-22 20:22:35

标签: c++ lua

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

我想开始非常简单并公开一个变量(比如int myVar = 5),以便Lua中的更改将反映在C ++应用程序中。

有没有人知道任何好的教程可以告诉我如何做到这一点?

3 个答案:

答案 0 :(得分:5)

仅使用Lua API公开变量以进行直接修改并非易事。你必须创建Lua表或userdata(分别使用 lua_newtable lua_newuserdata ),然后创建一个元表 - 在你的情况下它应该有 __ index __ newindex 事件,在这些函数中,您应该按名称匹配变量。手动编写并不好玩。

那就是说,你应该很清楚你不能在全局Lua级别公开变量 - 你应该把它变成table / userdata的一个成员。这看起来很像Lua中的类/对象,因此暴露单个变量并不比暴露类简单。更重要的是,暴露功能/方法要简单得多。所以阅读有关暴露类的教程肯定会有所帮助。

但仅使用Lua API仍然没有乐趣。不要误会我的意思,Lua API很简洁,但是如果你有很多东西要暴露它真的很乏味你最终会写出很多无聊的重复代码来绑定你的类或写一些为你自动完成这项任务的工具(使用大量的宏很可能是你的第一个想法,在那里,完成了;))。这些工具已经存在,tolua++luabind以及其他许多工具。

答案 1 :(得分:3)

正如sbk所提到的,您将作为userdata的成员访问您的变量:

print(cside.myVar) -- 5

以下是使用Lua API执行此操作的示例代码。它简单明了,虽然单调乏味。你要么想要制作自己的代码生成器,要么使用像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 :(得分:2)

听起来你想看tolua++