1.简介
因为需要将一些C中的全局变量保存起来,供其他模块使用,所以需要将这些变量放入lua的userdata中。因为刚学lua不久,这里使用比较简单的lightuserdata的方法,直接将全局变量地址放入lua栈中保存。更复杂的可以学习userdata和metadata的具体方法。
2.示例
static const void *key = 0;
int count = 5;
static int init(lua_State *L)
{
if (key==0)
{
lua_getfield (L, LUA_REGISTRYINDEX, "MyExtensionLibrary");
key=lua_touserdata(L,-1);
lua_pop(L,1);
if (key==0)
{
key=(void*)&key;
lua_pushlightuserdata(L, key);
lua_setfield(L, LUA_REGISTRYINDEX, "MyExtensionLibrary");
}
}
}
static int set_num(lua_State *L)
{
void *key = 0;
lua_getfield (L, LUA_REGISTRYINDEX, "MyExtensionLibrary");
key=lua_touserdata(L,-1);
lua_pushlightuserdata(L, key);
lua_pushlightuserdata(L, &count);
lua_settable(L, LUA_REGISTRYINDEX);
return 0;
}
static int get_num(lua_State *L)
{
void *key = 0;
lua_getfield (L, LUA_REGISTRYINDEX, "MyExtensionLibrary");
key=lua_touserdata(L,-1);
lua_pushlightuserdata(L, key);
lua_gettable(L, LUA_REGISTRYINDEX);
printf("count:%d\n", *(int*)(lua_touserdata(L,-1)));
}
static const struct luaL_Reg libctlsys[] = {
{"init", init},
{"set_num", set_num},
{"get_num", get_num},
{NULL, NULL}
};
extern int luaopen_test(lua_State* L)
{
luaL_newlib(L, libctlsys);
return 1;
}
这里参考:
云风的 BLOG: Lua 中写 C 扩展库时用到的一些技巧。作者初学lua,有错误的地方欢迎指出。