如何将C ++函数公开给lua脚本?

时间:2013-10-15 12:30:19

标签: c++ function lua

我刚刚成功创建了一个lua项目。 (到目前为止运行lua脚本的简单代码。)
但是,我现在如何为lua脚本创建一个c ++函数和一个c ++变量?

举个例子:

int Add(int x, int y) {
    return x + y;
}

float myFloatValue = 6.0

我对c ++很新,所以我真的希望它不会太复杂。这是我到目前为止获得的代码:

#include "stdafx.h"
extern "C" {
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
}

using namespace System;

int main(array<System::String ^> ^args)
{
    lua_State* luaInt;
    luaInt = lua_open();
    luaL_openlibs (luaInt);
    luaL_dofile (luaInt, "abc.lua");
    lua_close(luaInt);
    return 0;
}

2 个答案:

答案 0 :(得分:11)

我会接受John Zwinck的回答,因为经验证明,使用Lua本身就是一个痛苦的屁股。但是,如果你想知道答案,请检查其余部分。

要注册C / C ++函数,首先需要让函数看起来像Lua提供的标准C函数模式:

extern "C" int MyFunc(lua_State* L)
{
  int a = lua_tointeger(L, 1); // First argument
  int b = lua_tointeger(L, 2); // Second argument
  int result = a + b;

  lua_pushinteger(L, result);

  return 1; // Count of returned values
}

需要在Lua中注册的每个函数都应遵循此模式。返回int类型,lua_State* L的单个参数。和返回值的计数。

然后,您需要在Lua的注册表中注册它,以便将它暴露给脚本的上下文:

lua_register(L, "MyFunc", MyFunc);

对于注册简单变量,您可以这样写:

lua_pushinteger(L, 10);
lua_setglobal(L, "MyVar");

之后,您可以从Lua脚本调用您的函数。请记住,在运行具有您用于注册它们的特定Lua状态的任何脚本之前,您应该注册所有对象。

在Lua:

print(MyFunc(10, MyVar))

结果:

20

答案 1 :(得分:2)

我建议使用Luabind

,而不是使用Lua C API

Luabind是一个相当高级的库,专门用于向Lua公开C ++类和函数。没有使用Lua C API函数,没有操作Lua堆栈等等。它的灵感来自Boost Python,所以如果你学习了一个,你将大部分都能理解另一个。