我刚刚成功创建了一个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;
}
答案 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 APILuabind是一个相当高级的库,专门用于向Lua公开C ++类和函数。没有使用Lua C API函数,没有操作Lua堆栈等等。它的灵感来自Boost Python,所以如果你学习了一个,你将大部分都能理解另一个。