鱒身(Masu_mi)のブログ

知った事をメモする場所。

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

luaのソースコードを読んでいてマクロの使い方に感心した。 そんなに真剣にプログラミングのイディオムとか勉強した事無かった。

複数環境に向けたシンボルを晒す

以下はluaconf.hで定義されている。

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

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

#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
/* ... */

#define LUALIB_API>-LUA_API
#define LUAMOD_API>-LUALIB_API

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

関数・定数・変数の定義を分けている。 意図を明確にするというのは大事だね。pythonでプライベート的なメソッドは_leadingにするってのに近い。 特にアクセス範囲などは定型情報だし、コメント(自然言語)より記法(マクロ)の方が良いのかも知れない。

#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系だとシンボルの可視性をコントロール出来る。なんか毛色が違う気がした。

エキスパートC読もうって思った。 次はLuaVMのlua_State,global_Stateとか仮想マシンの操作周辺について調べる。 あとライブラリの作り方についてもまとめておいた方が良いな。