lua和C通過(guò)虛擬棧這種交互方式簡(jiǎn)單而又可靠,缺點(diǎn)就是C做棧平衡稍微會(huì)多寫(xiě)一點(diǎn)代碼。 今天分享學(xué)到的C模塊回調(diào)Lua函數(shù)的兩種方法,都是炒冷飯,大俠勿噴。
1. C保存函數(shù)對(duì)象
C模塊可以通過(guò)注冊(cè)表保存Lua里面的對(duì)象,等適當(dāng)時(shí)候取出再調(diào)用即可。
static int setnotify(lua_State *L)
{
lua_callback = luaL_ref(L, LUA_REGISTRYINDEX);
return 0;
}
static int testnotify(lua_State *L)
{
lua_rawgeti(L, LUA_REGISTRYINDEX, lua_callback);
lua_call(L, 0, 0);
}
cb.setnotify(callback)
cb.testnotify()
3. 完整例子
cb.c
static int lua_callback = LUA_REFNIL;
static int setnotify(lua_State *L)
{
lua_callback = luaL_ref(L, LUA_REGISTRYINDEX);
return 0;
}
static int testnotify(lua_State *L)
{
lua_rawgeti(L, LUA_REGISTRYINDEX, lua_callback);
lua_call(L, 0, 0);
}
static int testenv(lua_State *L)
{
lua_getglobal(L, "defcallback");
lua_call(L, 0, 0);
}
static const luaL_Reg cblib[] = {
{"setnotify", setnotify},
{"testnotify", testnotify},
{"testenv", testenv},
{NULL, NULL}
};
int luaopen_cb(lua_State *L)
{
luaL_register(L, "cb", cblib);
return 1;
}
function callback( )
print "Callback"
end
function defcallback()
print "Predef callback"
end
cb.setnotify(callback)
cb.testnotify()
print "Done"
cb.testenv()
標(biāo)簽:天門(mén) 宣城 儋州 濰坊 天門(mén) 德宏 臺(tái)灣 金昌
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《C語(yǔ)言模塊回調(diào)Lua函數(shù)的兩種方法》,本文關(guān)鍵詞 語(yǔ)言,模塊,回調(diào),Lua,函數(shù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。