開(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 **