如何在Lua调用C/C++;
我正在使用Lua调用dll文件。 我的c/c++代码如下所示:如何在Lua调用C/C++;,c,types,lua-userdata,C,Types,Lua Userdata,我正在使用Lua调用dll文件。 我的c/c++代码如下所示: #include <iostream> extern "C"{ #include "lua.hpp" #include "lualib.h" #include "lauxlib.h" } using namespace std; typedef struct StructA{ int a; } structA; typedef struct StructB{ char *b;
#include <iostream>
extern "C"{
#include "lua.hpp"
#include "lualib.h"
#include "lauxlib.h"
}
using namespace std;
typedef struct StructA{
int a;
} structA;
typedef struct StructB{
char *b;
} structB;
static int createA(lua_State *L)
{
int n = lua_gettop(L);
size_t iBytes = sizeof(struct StructA);
struct StructA *sa;
sa = (StructA *)lua_newuserdata(L, iBytes);
sa->a = 1;
return 1;
}
static int createB(lua_State *L)
{
int n = lua_gettop(L);
size_t iBytes = sizeof(struct StructB);
struct StructB *sb;
sb = (StructB *)lua_newuserdata(L, iBytes);
sb->b = "2";
return 1;
}
static int print(lua_State *L)
{
if("some condition")//struct type is StructA
{
cout<< "struct type is StructA" <<endl;
struct StructA *sa = (struct StructA *)lua_touserdata(L, 1);
cout<< "a:"<<(sa->a) <<endl;
}else if("some condition")//struct type is structB
{
cout<< "struct type is StructB" <<endl;
struct StructB *sb = (struct StructB *)lua_touserdata(L, 1);
cout<< "b:"<<(sb->b) <<endl;
}
return 0;
}
static luaL_Reg mylibs[] = {
{ "A", createA },
{ "B", createB },
{ "print", print },
{ NULL, NULL }
};
extern "C" __declspec(dllexport)
int luaopen_occi_test(lua_State* L)
{
luaL_register(L, "occi_test", mylibs);
return 1;
}
local a = occi_test.A()
local b = occi_test.B()
occi_test.print(a)
occi_test.print(b)
如您所见,在Lua中,参数a和b都是userdata类型,但在C/C++中,a的类型是StructA,b的类型是StructB,因此当Lua调用C/C++函数并传递a或b时,C/C++代码如何找出参数的类型?请通过将“某些条件”替换为可以完成此工作的东西来完成此代码
luaopen_occi_测试开始时,doluaL_newmetatable(L,“StructA”)代码>和luaL_newmetatable(L,“StructB”)代码>。这将向注册表中添加元表,以便以后使用
createA
和createB
的末尾,执行luaL_setmetatable(L,“StructA”)代码>和luaL_可设置元表(L,“StructB”)代码>。这将把您在步骤1中创建的相应元表附加到新的userdata对象
print
中的条件,请使用luaL\u testudata(L,1,“StructA”)
和luaL\u testudata(L,1,“StructB”)
。当userdata是具有命名元表的userdata时,它们返回指向userdata的指针(转换为布尔值时为true),否则返回空指针(转换为布尔值时为false)。或者,您可以通过保存结果,然后只使用正确的结果来稍微优化代码,如下所示:静态整型打印(lua_State*L)
{
struct StructA*sa;
struct StructB*sb;
if((sa=(struct StructA*)luaL_testudata(L,1,“StructA”)!=nullptr)
{
库特
在luaopen\u occi\u测试开始时,执行luaL\u newmetatable(L,“StructA”);
和luaL\u newmetatable(L,“StructB”);
。这将向注册表中添加元表,供以后使用
在createA
和createB
的末尾,执行luaL_setmetatable(L,“StructA”);
和luaL_setmetatable(L,“StructB”);
。这将把您在步骤1中创建的适当的元表附加到新的userdata对象
对于print
中的条件,请使用luaL\u testudata(L,1,“StructA”)
和luaL\u testudata(L,1,“StructB”)
。如果用户数据是具有命名元表的用户数据,则返回指向该用户数据的指针(转换为布尔值时为true),或者返回空指针(转换为布尔值时为false)否则。或者,您可以通过保存结果,然后使用正确的结果来稍微优化代码,如下所示:
静态整型打印(lua_State*L)
{
struct StructA*sa;
struct StructB*sb;
if((sa=(struct StructA*)luaL_testudata(L,1,“StructA”)!=nullptr)
{
CuStEt为每个Lua对象提供一个元集。答案很大程度上取决于你是否使用C或C++。(特别是C++的RTTI使得可以发现一个对象的类。)“请完成这个代码”并不是堆栈溢出的工作。抱歉“请完成这个代码”。这是因为我不熟悉英语,这是别人能理解我写的唯一方法。不管怎样,如果我添加“CUT为每个LUA对象设置一个元,答案很大程度上取决于你是使用C还是C++。(特别是C++的RTTI使得可以发现一个对象的类。)“请完成此代码”不是堆栈溢出的工作方式。很抱歉“请完成此代码”的事情,因为我不熟悉英语,这是其他人能够理解我所写内容的唯一方法。无论如何,如果我添加“cout”