【问题标题】:How to expose C++ functions to a lua script?如何将 C++ 函数公开给 lua 脚本?
【发布时间】:2023-03-17 11:39:01
【问题描述】:

我刚刚成功创建了一个 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;
}

【问题讨论】:

标签: c++ function lua


【解决方案1】:

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

【讨论】:

  • MyFunc 必须是 extern "C"
  • @Simple 是的,我认为 Lua 包含在 extern "C" 中,所以我没有提及。
  • 这正是MyFunc 必须是extern "C" 的原因。 lua_CFunction 是指向具有 C 链接的函数的指针,但 MyFunc 具有 C++ 链接。标准说这是两种不同的类型,所以它不应该编译(尽管大多数主流编译器错误地接受它)。
  • 非常感谢您!这非常有帮助。我想知道你能否告诉我为什么我会收到大约 30 条警告? pastebin.com/KpTYvPDZ
  • @Forivin 您正在使用托管 C++,我认为这就是原因。我没有使用过 C++ CLI,我不知道 Lua 是否与托管 C++ 兼容。创建一个空的 Win32 项目,然后测试您的代码。
【解决方案2】:

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

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

【讨论】:

猜你喜欢
  • 2010-11-15
  • 2018-04-23
  • 2010-12-01
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多