lua5 2模組註冊

2021-07-05 06:24:39 字數 893 閱讀 4398

lua 5.2不鼓勵使用lual_register把模組註冊到全域性域,而是使用lual_newlib。

我們首先看下lual_newlib,它是乙個巨集,**如下:

#define lual_newlib(l,l)    (lual_newlibtable(l,l), lual_setfuncs(l,l,0))
lual_newlibtable建立乙個表放到棧頂,然後lual_setfuncs把列表引數l中的函式名作為key,函式位址用來建立的閉包作為value插入到新建的table中,**如下:

lualib_api void lual_setfuncs (lua_state *l, const lual_reg *l, int nup) 

lua_pop(l, nup); /* remove upvalues */

}

lual_setfuncs 函式在壓入c閉包之前,把位於棧頂的nup個upvalue(外層函式區域性變數)重新壓棧,在建立c閉包的時候,存到c閉包的upvalue鍊錶中。lua模組註冊的時候,nup是0,故不用考慮upvalue入棧。c閉包入棧函式如下:

lua_api void lua_pushcclosure (lua_state *l, lua_cfunction fn, int n) 

else

api_incr_top(l);

lua_unlock(l);

}

如果沒有upvalue,此時壓入的是light c function,否則壓入的是c closure。回到lual_setfuncs函式,壓棧閉包後,設定函式名和閉包(或者light c function)的鍵值對,最後刪除棧頂的upvalue。

此時,模組註冊完畢。

lua 5 2的 luaL newlib 的用法

對於lua 5.2,lua 5.2是2011年發布的。國內使用5.1的居多。lual register 和lual openlibs。這些功能大多數都廢棄了 lual register這個註冊c 的庫函式,功能被廢棄了。新的api lual newlib 網上的資料不多。下面給出乙個使用 lual ...

lua5 2 帶你理解 ENV和 G

5.1之前,全域性變數儲存在 g這個table中,這樣的操作 a 1 相當於 g a 1 但在5.2之後,引入了 env叫做環境,與 g全域性變數表產生了一些混淆,需要從原理上做乙個理解。在5.2中,操作a 1 相當於 env a 1 這是乙個最基礎的認知改變,其次要格外注意 env不是全域性變數,...

vs2012編譯使用lua 5 2靜態庫

2.開啟vs2012新建空白工程test 3.在解決方案中新增新的lib工程 win32 選擇靜態lib 不要預編譯頭 lualib 4.配置lualib工程 a 將lua源 下的src檔案拷入lualib資料夾下,並在工程中匯入 b lualib工程屬性c c genaral additional...