LuaへのC関数の登録
luaL_registerとlua_pushcfunctionを使ってC関数をLuaスクリプトに公開します。
「LuaへのC関数の登録」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
概要
C関数はLuaスクリプトに公開できます。関数のシグネチャはint myFunc(lua_State *L)でなければなりません。関数はスタックから引数を読み取り、戻り値をpushします。
C関数のシグネチャ
Luaから呼び出せるすべての関数はlua_CFunctionです。lua_State*を受け取り、引数を読み取り、結果をpushして、結果の個数を返します。
// C code
static int l_add(lua_State *L) {
double a = luaL_checknumber(L, 1);
double b = luaL_checknumber(L, 2);
lua_pushnumber(L, a + b);
return 1; // one result
}グローバルとして登録する
lua_pushcfunction(L, l_add)でC関数をpushし、続いてlua_setglobal(L, "add")でLuaのグローバル関数として登録します。
// C code
lua_pushcfunction(L, l_add);
lua_setglobal(L, "add");
// Now Lua can call: add(3, 4)luaL_newlib / luaL_register
luaL_Reg配列とluaL_newlibを使って、複数のC関数をLuaモジュールとして登録します。
// C code
static const luaL_Reg mylib[] = {
{"add", l_add},
{"mul", l_mul},
{NULL, NULL}
};
luaL_newlib(L, mylib);
lua_setglobal(L, "mylib");
// Lua: mylib.add(1, 2)引数の読み取り
luaL_checknumber(L, n)やluaL_checkstring(L, n)などは、引数を読み取って検証し、型が正しくない場合はLuaエラーを発生させます。
複数の値を返す
複数の値をpushし、その個数を返します。Luaはそれらを複数の戻り値として割り当てます。
// C code
static int l_divmod(lua_State *L) {
int a = luaL_checkinteger(L, 1);
int b = luaL_checkinteger(L, 2);
lua_pushinteger(L, a / b);
lua_pushinteger(L, a % b);
return 2; // two results
}Cクロージャのupvalue
Cクロージャは、登録時にlua_pushcclosure(L, fn, n)を使ってupvalueを捕捉します。lua_upvalueindex(n)でupvalueにアクセスできます。
Cからのエラー報告
C関数からLuaエラーを発生させるには、luaL_error(L, format, ...)を呼び出します。この関数は戻らず、保護された呼び出しのハンドラーへlongjmpします。
// C code
if (divisor == 0)
luaL_error(L, "division by zero at argument %d", 2);.so/.dllとしてのCモジュール
Cモジュールはluaopen_modname関数を公開します。Luaのrequireが共有ライブラリを読み込み、モジュールを初期化するためにこの関数を呼び出します。
// C code (shared library entry point)
int luaopen_mymod(lua_State *L) {
luaL_newlib(L, mymod_funcs);
return 1;
}引数の個数チェック
lua_gettop(L)を使って渡された引数の個数を確認します。luaL_checkany(L, n)は、少なくともn個の引数が渡されていることを保証します。
LuaJIT FFIという選択肢
LuaJITのFFIを使うと、Cのラッパーコードを書かずにLuaからC関数を直接呼び出せます。単純な関数呼び出しだけなら、多くの場合こちらの方が簡単です。より深い統合にはC APIが必要です。
C関数に関する質問
Luaから呼び出せるC関数は何を返す必要がありますか?
復習:C関数の登録
Luaから呼び出せるC関数のシグネチャはint f(lua_State*)です。luaL_check*で引数を読み取り、結果をpushして、個数を返します。lua_pushcfunctionで個別に、またはluaL_newlibでまとめて登録します。
よくある質問
「LuaへのC関数の登録」レッスンは無料ですか?
はい。「LuaへのC関数の登録」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「LuaへのC関数の登録」で何を学びますか?
luaL_registerとlua_pushcfunctionを使ってC関数をLuaスクリプトに公開します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「LuaへのC関数の登録」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Lua C APIのスタックモデル
- CからのLua関数呼び出し
- LuaへのC関数の登録
- 状態管理とエラー処理