出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/05/17 08:04 UTC 版)
「Lua」の記事における「LuaとC/C++の相互運用」の解説
LuaにはC言語向けの相互運用APIが用意されている。LuaからC/C++の関数を呼び出すためには以下の方法を用いる。下記のコードはC/C++の関数をLua VMに登録し、Luaスクリプト側から呼び出している。 #include #include #include #include int my_add(lua_State* L) { const int x = (int)lua_tonumber(L, 1); // 第1引数の取得。 const int y = (int)lua_tonumber(L, 2); // 第2引数の取得。 lua_settop(L, 0); // スタックのクリア。 const int ret = x + y; // C/C++ 側での演算。 lua_pushnumber(L, ret); // 返却値をプッシュ。 return 1;}int main(int argc, char* argv[]) { lua_State* L = luaL_newstate(); // Lua VM の初期化。 luaL_openlibs(L); // Lua の標準ライブラリを使えるようにする。 lua_register(L, "my_add", my_add); // Lua VM に C/C++ 関数を登録。 // my_add 関数を呼び出す Lua スクリプトを実行。 if (luaL_dostring(L, "print(my_add(5, 3))")) { lua_close(L); // Lua VM を閉じる。 return EXIT_FAILURE; // エラー終了。 } lua_close(L); return EXIT_SUCCESS;} 逆に、C/C++からLuaの関数を呼び出す際にもスタック操作が必要となる。 #include #include #include #include int main(int argc, char* argv[]) { lua_State* L = luaL_newstate(); // Lua VM の初期化。 // add_func 関数を定義する Lua スクリプトを実行。 if (luaL_dostring(L, "function add_func(x, y) return x + y end")) { lua_close(L); // Lua VM を閉じる。 return EXIT_FAILURE; // エラー終了。 } lua_getglobal(L, "add_func"); // Lua のグローバルオブジェクトである「add_func」を取得し、スタックに積む。 lua_pushinteger(L, 5); // 整数値の「5」を Lua スタックにプッシュ。 lua_pushinteger(L, 3); // 整数値の「3」を Lua スタックにプッシュ。 lua_call(L, 2, 1); // Lua 側で実装した add_func 関数を呼び出す。引数の数は2、結果の数は1。 printf("Result: %d\n", lua_tointeger(L, -1)); // 結果を表示。 lua_close(L); return EXIT_SUCCESS;}
※この「LuaとC/C++の相互運用」の解説は、「Lua」の解説の一部です。
「LuaとC/C++の相互運用」を含む「Lua」の記事については、「Lua」の概要を参照ください。