今回はluaL_loadfile関数とluaL_dofile関数の違いです。(正式にはマクロだけど)
どちらも、ファイルからLuaスクリプトを読み込む関数なのですが、
luaL_loadfile関数は読みこむだけ、luaL_dofile関数は読みこんだ後スクリプトを実行をします。
Luaでこんなプログラムを読みこむ事を考えます。
function foo()
print "call foo"
end
function hoo()
print "call hoo"
end
C言語からfooやhooを呼び出しながら使う、という事を想定していますが、
ここで読みこむ時はluaL_dofile関数を使う必要があります。
C言語に慣れていると、luaL_loadfile関数で読みこむだけで中間コードへの変換は出来ているから、
実行する必要はない、と考えてしまうのですが、それは間違いです。
先ほどのスクリプトを書き換えるとこうなります。
foo = function()
print "call foo"
end
hoo = function()
print "call hoo"
end
以上でわかるとおり、グローバル変数のfoo, hoo に関数の内容を代入するために
スクリプト全体を実行する必要があるのです。
Luaには関数宣言に当たるものがないので、中間コードに変換されているだけでは意味を持ちません。
バッファから読み込む場合は、luaL_loadbuffer関数を使いますが、
luaL_dofile関数に当たる関数はないので、lua_pcall関数を使って実行する必要があります。