因为需要将一些C中的全局变量保存起来,供其他模块使用,所以需要将这些变量放入lua的userdata中。因为刚学lua不久,这里使用比较简单的lightuserdata的方法,直接将全局变量地址放入lua栈中保存。更复杂的可以学习userdata和matedata的具体方法。
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:%dn", *(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,有错误的地方欢迎指出。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)