鱒身(Masu_mi)のブログ

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

((void)0)の使い方

ヘッダファイル lua/lua-5.2.2/src/llimits.h に以下の様なマクロが定義されていた。

#define lua_lock(L)     ((void) 0)
/* ... */
#define lua_unlock(L)     ((void) 0)

(void)0 は何もしないopコードを吐くらしい。何でこんなのを書くのかサッパリだった。

検索したらこんなのを見つけた stackoverflow::Purpose of lua_lock ...

これによると、Luaを別のプラットフォームに移植する際に lua_lock, lua_unlock を上書きし mutexなどのロック機構を導入する事でPythonのGILみたいな事を実現するためらしい。 なので #if !defined(lua_lock) で囲まれており上書き時は定義されていない。

そこで ((void) 0) じゃなく /* no lock mechanism */ コメントだったら駄目なのか考えた。 結論は ((void)0) の方が良い。

理由は以下の様なコードが存在した場合コンパイルを通過しなくなるため。

apple? lua_lock(L) : orange();

コメントへ置き換えるマクロでは、三項間演算子が不正でコンパイルエラーを起こす。 見た目が式なので式として振る舞う方が混乱が少ないからだ。