LUA_API lua_Alloc

開(kāi)篇

本節(jié)了解一下 lua_Alloc 這個(gè) API。
由于它不是函數(shù),而只是一個(gè)類(lèi)型定義,因此不會(huì)分析得很詳盡透徹。
此外,由于上節(jié)沒(méi)有對(duì) LUA_API 宏定義做出解釋?zhuān)竟?jié)會(huì)附帶說(shuō)明一下 。
雖然本節(jié)比較簡(jiǎn)短,但其中涉及到的知識(shí)比較復(fù)雜,消化起來(lái)需要一點(diǎn)時(shí)間,參考文獻(xiàn)處給出了一些鏈接,可以幫助理解。

解析

首先還是找到定義處,出自 lua.h

// lua.h 124
/*
** Type for memory-allocation functions
*/
typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);

這里定義了一個(gè)函數(shù)指針類(lèi)型lua_Alloc,它帶 4 個(gè)參數(shù),返回 1 個(gè) void * 類(lèi)型的值。在源碼中搜索一下,找到一處用例:

// luaxlib.h 462
static void *resizebox (lua_State *L, int idx, size_t newsize) {
  void *ud;
  // LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud);
  lua_Alloc allocf = lua_getallocf(L, &ud); // 完成定義
  UBox *box = (UBox *)lua_touserdata(L, idx);
  void *temp = allocf(ud, box->box, box->bsize, newsize); // 這邊才是函數(shù)原型調(diào)用
  ...
  return temp;
}

擴(kuò)展 :LUA_API

在源碼中,我們會(huì)經(jīng)常看到某些函數(shù)開(kāi)頭都有一個(gè) LUA_API,上一節(jié)沒(méi)有解釋?zhuān)彩鞘韬隽恕=裉斐弥鴽](méi)有忘記,來(lái)記錄一下。
我們依然先找到它的定義:

// luaconf.h 232
/*
@@ LUA_API is a mark for all core API functions.
@@ LUALIB_API is a mark for all auxiliary library functions.
@@ LUAMOD_API is a mark for all standard library opening functions.
** CHANGE them if you need to define those functions in some special way.
** For instance, if you want to create one Windows DLL with the core and
** the libraries, you may want to use the following definition (define
** LUA_BUILD_AS_DLL to get it).
*/
#if defined(LUA_BUILD_AS_DLL)   /* { */

#if defined(LUA_CORE) || defined(LUA_LIB)   /* { */
#define LUA_API __declspec(dllexport)
#else                       /* }{ */
#define LUA_API __declspec(dllimport)
#endif                      /* } */

#else               /* }{ */

#define LUA_API     extern

#endif              /* } */


/* more often than not the libs go together with the core */
#define LUALIB_API  LUA_API
#define LUAMOD_API  LUALIB_API

通讀注釋?zhuān)梢詺w納出以下幾點(diǎn):

  • LUA_API 用于標(biāo)志核心 API 函數(shù);
  • LUALIB_API 用于標(biāo)志輔助庫(kù)函數(shù);
  • LUAMOD_API 用于標(biāo)志標(biāo)準(zhǔn)庫(kù)函數(shù);
  • 當(dāng)然,如果有特殊需求,可以自行修改定義。默認(rèn)的,LUA_API、 LUALIB_API、 LUAMOD_API 是一樣的。

我們繼續(xù)查找 LUA_BUILD_AS_DLL,在 src/Makefile 中找到了它 (Makefile 用于指導(dǎo)編譯和鏈接時(shí)的行為)

## Makefile 118
mingw:
    $(MAKE) "LUA_A=lua53.dll" "LUA_T=lua.exe" \
    "AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \
    "SYSCFLAGS=-DLUA_BUILD_AS_DLL" "SYSLIBS=" "SYSLDFLAGS=-s" lua.exe
    $(MAKE) "LUAC_T=luac.exe" luac.exe

說(shuō)明一下,mingw 是將 GCC 編譯器和 GNU Binutils 移植到 Win32 平臺(tái)下的產(chǎn)物。這里是在構(gòu)建 Windows 環(huán)境時(shí)作為參數(shù)傳輸進(jìn)去,意思是要求 lua 在編譯后導(dǎo)出 dll。這里沒(méi)有 Windows 環(huán)境,也就不測(cè)試了,有興趣的可以自己去倒騰一番。

由于筆者是MacOSX 環(huán)境,因此這里走的是 #define LUA_API extern

終了

  • 通讀注釋?zhuān)苡袔椭?/li>
  • 提高英文水平勢(shì)在必行;
  • 別吝惜提問(wèn),StackOverflow 會(huì)給你驚喜。

參考文獻(xiàn)

** typedef **

** Makefile **

** mingw **

** __declspec **

** extern **

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容