2013-10-15 51 views
7

我刚成功创建了一个lua项目。 (到目前为止运行lua脚本的简单代码)。
但是,我现在如何为lua脚本创建C++函数和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; 
} 
+1

检查:http://lua-users.org/wiki/BindingCodeToLua – user1095108

回答

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)) 

结果:

+0

'MyFunc'必须是'extern'C''。 – Simple

+0

@Simple是的,我认为Lua被包含在'extern“C”'中,所以我没有提到它。 – MahanGM

+3

这就是为什么'MyFunc'需要'extern'C''。 'lua_CFunction'是一个指向C链接的函数,但是'MyFunc'具有C++链接。该标准说这些是两种不同的类型,因此它不应该编译(尽管大多数主流编译器错误地接受它)。 – Simple

2

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

Luabind是一个相当高级的库,专门为向Lua公开C++类和函数而构建。不使用Lua C API函数,不用操纵Lua栈等等。它受Boost Python的启发,所以如果你学习了一个,你就会主要理解另一个。

+0

或[LuaBridge](HTTP:// vinniefalco.com/LuaBridge/Manual.html),以防作者不想使用Boost。 –