关于C存储,取得,释放lua的引用

这篇文章详细描述了c怎样存储,取得,释放lua的引用,通过代码一一展现。转载请注明地址。

作者:Jonee

文章出自:http://jonee.net/?p=122

c:


#include "windows.h"       

#include          

extern "C"{          

#include "lua.h"           

#include "lualib.h"         

#include "lauxlib.h"          

}         

#pragma   comment(lib,"lua5.1.lib")         

lua_State * L;             

static int GetRef(lua_State *L)   //取引用        

{         

    int ref = luaL_checkint(L, -1);        

    lua_pop(L, -1); //清栈       

    //根据索引取lua对象并压栈       

    lua_rawgeti(L, LUA_REGISTRYINDEX, ref);       

    if (!lua_istable(L, -1))       

    {       

        //printf("ref table is not valid:%d", ref);       

        //return 0;       

    }       

    return 1;         

}   

static int SetRef(lua_State *L)   //设置引用      

{         

    //创建索引并从栈顶弹出该对象       

    int ref = luaL_ref(L, LUA_REGISTRYINDEX);     

    if(ref == LUA_REFNIL)  

    {       

        //printf("set ref error, arg is nil");       

        //return 0;       

    }   

    lua_pop(L, -1); //清栈    

    //压入参数       

    lua_pushnumber(L, (lua_Number)ref);    

    return 1;         

}    

static int DelRef(lua_State *L)   //删引用   

{         

    int ref = luaL_checkint(L, -1);        

    lua_pop(L, -1); //清栈       

    luaL_unref(L, LUA_REGISTRYINDEX, ref);    

    return 0;        

}     

static const luaL_reg lengine[] = {       

    {"getref", GetRef},   

    {"setref", SetRef},   

    {"delref", DelRef},   

    {NULL, NULL},       

};       

int main()    

{    

    //创建一个指向lua解释器的指针         

    L = luaL_newstate();         

    //加载lua标准库         

    luaL_openlibs(L);               

    //加载脚本         

    luaL_register(L, "lengine", lengine);        

    luaL_dofile(L,"1.lua");   

    lua_close(L);       

    return 0;        

}  

lua:


local a = {1,2,3}  

local ref = lengine.setref(a)  

local b = lengine.getref(ref)  

print(a == b and "true\n" or "false\n")  

lengine.delref(ref)  

local b = lengine.getref(ref)  

print(a == b and "true\n" or "false\n")  

留下只言片语: