Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何公开C++;lua脚本的函数?_C++_Function_Lua - Fatal编程技术网

C++ 如何公开C++;lua脚本的函数?

C++ 如何公开C++;lua脚本的函数?,c++,function,lua,C++,Function,Lua,我刚刚成功创建了一个lua项目。(迄今为止运行lua脚本的简单代码。) 但是,现在我如何使一个C++函数和一个C++变量可以用于Lua脚本? 例如: int Add(int x, int y) { return x + y; } 及 我对C++很陌生,所以我真的希望它不会太复杂。以下是我到目前为止得到的代码,顺便说一句: #include "stdafx.h" extern "C" { #include "lua.h" #include "lualib.h" #

我刚刚成功创建了一个lua项目。(迄今为止运行lua脚本的简单代码。)
但是,现在我如何使一个C++函数和一个C++变量可以用于Lua脚本? 例如:

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

我对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;
}
#包括“stdafx.h”
外部“C”{
#包括“lua.h”
#包括“lualib.h”
#包括“lauxlib.h”
}
使用名称空间系统;
int main(数组^args)
{
卢奥州*luaInt;
luaInt=lua_open();
luaL_openlibs(luaInt);
luaL_dofile(luaInt,“abc.lua”);
lua_close(luaInt);
返回0;
}

我建议使用luaapi,而不是使用luaapi


Luabind是一个专门构建高级库,用于向Lua公开C++类和函数。无需使用Lua C API函数,无需操作Lua堆栈等。它的灵感来自Boost Python,因此,如果您学习其中一个,您将基本了解另一个。

我将使用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\u State*L
。和返回值的计数

然后,需要将其注册到Lua的注册表中,以便将其公开到脚本的上下文中:

lua_register(L, "MyFunc", MyFunc);
要注册简单变量,可以编写以下代码:

lua_pushinteger(L, 10);
lua_setglobal(L, "MyVar");
之后,您就可以从Lua脚本调用函数了。请记住,在使用用于注册对象的特定Lua状态运行任何脚本之前,应该注册所有对象

在卢阿:

print(MyFunc(10, MyVar))
结果:


20

MyFunc
需要是
extern“C”
@Simple是的,我假设Lua包含在
extern“C”
中,所以我没有提到它。这正是
MyFunc
需要是
extern“C”
的原因<代码> LuaYCKult<代码>是一个指向C函数的指针,但是 MyFunc 具有C++链接。标准说这是两种不同的类型,所以它不应该编译(尽管大多数主流编译器错误地接受它)。非常感谢!这非常有用。我想知道你能否告诉我为什么我会收到30条警告@FiVIN你使用的是管理C++,我认为这就是原因。我还没有使用C++ CLI,我不知道Lua是否兼容托管C++。创建一个空的Win32项目,然后测试您的代码。请检查此项:或者只是为了防止作者不想使用Boost。@Dmitryletonsov该站点现在已停止运行,似乎正在运行
print(MyFunc(10, MyVar))