如何在Lua调用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;

我正在使用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;
} 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_测试开始时,do
    luaL_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”