7

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

举个例子:

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;
}
4

2 回答 2

12

我会接受 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

于 2013-10-15T12:46:15.293 回答
2

我建议不要使用 Lua C API,而是使用Luabind

Luabind 是一个相当高级的库,专门用于向 Lua 公开 C++ 类和函数。不使用 Lua C API 函数,不操作 Lua 堆栈等。它受到 Boost Python 的启发,所以如果你学习一个,你将主要理解另一个。

于 2013-10-15T12:34:43.683 回答