LUA Userdata

1 lua中, userdata存在栈上元素里的只是指针, 他们都会在生命周期结束后被垃圾回收

2 userdata也可以关联元表,不过只能通过luaL_newmetatable创建的元表

3 如果你的userdata关联了一些用户数据,需要userdata失效时也清理掉,那附加的元表可以设置__gc

int __lua__call(lua_State* L)

{

//
//栈底是userdata,上面是参数如果有的话, 普通的C函数调用栈只有参数
//

    printf("hello lua userdata called! ");

    return 0;

}

 

int __lua__gc(lua_State* L)

{

    printf("hello lua gc called! ");

    return 0;

}

 

 

void testmatetable()

{

    lua_State *L;

 

    L = luaL_newstate();

    luaL_openlibs(L);

 

    lua_register(L, "sleep", sleep_c);

 

 

    luaL_newmetatable(L, "lua.userdata.metatable");

    lua_pushliteral(L,"__call");

    lua_pushcfunction(L, __lua__call);

    lua_settable(L,-3);

 

    /*

    //

    //创建__gc

    //

    lua_pushliteral(L,"__gc");

    lua_pushcfunction(L, __lua__gc);

    lua_settable(L,-3);

    */

 

    lua_pop(L, 1);

 

    //

    //int lua_setmetatable (lua_State *L, int index);  给LUA值设置metatable

    //metatable存放在栈顶,LUA值通过index指出

    //

 

    //

    //创建userdata并关联metatable

    //

    //unsigned int* fidptr = (unsigned int *)lua_newuserdata(L, sizeof(unsigned int));

    //*fidptr = 998;

    //

    //值关联数字的话可以用lua_pushlightuserdata

    //

    lua_pushlightuserdata(L, (void*)998);

 

 

 

    luaL_getmetatable(L, "lua.userdata.metatable");

    lua_setmetatable(L, -2);

    //

    //现在栈顶上就只有创建的userdata了,把它设置到全局变量里面这样LUA能正常访问

    //

    //

 

 

   

    lua_setfield(L, LUA_GLOBALSINDEX, "hellouserdata");

 

   

    //

    //.test

    //

    luaL_loadstring(L, "hellouserdata (1,2,3); sleep(2000)");

 

    lua_call(L,0,0);

 

    lua_close(L);

   

}

原文地址:https://www.cnblogs.com/sysnap/p/6931893.html