Luaコードを読んでいて気になったマクロ

Luaのソースコードを読んでいてマクロの使い方についてメモ。

複数環境に向けシンボルを公開する

以下はluaconf.hで定義されている。 実装は同じだけど意味によって別名を与えてる。

LUA_API core API function
LUALIB_API 補助関数
LUAMOD_API 標準モジュールの外部関数

これらを関数宣言の前に記述する事で役割を明記しつつVisualStudio対策も行っている。 __declspec(dllexport)はDLL作る時に外部晒す関数で宣言するキーワードらしい。

luaconf.h#L244-L261

 1 2 3 4 5 6 7 8 9101112131415
#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
/* ... */

モジュール外へ公開する意図のない識別子の宣言

関数, 定数, 変数の定義をマクロで分けている。意図を明確にするというのは大事。 可視性などの指定を含んだマクロにしていてコンセプトによって対応を揃えているっぽい。

luaconf.h#L278-L286

 1 2 3 4 5 6 7 8 91011
#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \
     defined(__ELF__)
#define LUAI_FUNC __attribute__((visibility("hidden"))) extern
#define LUAI_DDEC LUAI_FUNC
#define LUAI_DDEF /* empty */

#else
#define LUAI_FUNC extern
#define LUAI_DDEC extern
#define LUAI_DDEF /* empty */
#endif

キーワード__attribute__gccで引数・返値の形式をコンパイラに通知する事で可変引数を実現したり, 返り値が存在しなくてもコンパイラがwarnを出さない様にしたりする。

ARMコンパイラでは更にvisibilityによって可視性もコントロールできる。

random note

エキスパートC読もうって思った。 次はLuaVMのlua_State, global_Stateなど仮想マシンの操作について調べる。

comments powered by Disqus