((void)0)の使い方

(void)0の使い方について知ったのでメモする。

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

luaconf.h

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

(void)0 は何もしないopコード(no-op)を吐くらしい。なぜこんなのを書くのかサッパリだったが、 stackoverflowで回答がついていた。

Luaを移植する際にlua_lock(), lua_unlockを上書きしロック機構を導入することで PythonのGILみたいな事を実現するためらしい。 vanila Luaは完全にANSI-Cで書かれていてシングルスレッドでしか走らないためno-opを吐き出すようになっているとのこと。

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

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

1
apple? lua_lock(L) : orange();

コメントに置き換えるマクロを利用していた場合は三項間演算子が不正でコンパイルエラーを起こす。

comments powered by Disqus