การลงทะเบียนฟังก์ชัน C ใน Lua
เปิดให้สคริปต์ Lua เรียกใช้ฟังก์ชัน C ด้วย luaL_register และ lua_pushcfunction
การลงทะเบียนฟังก์ชัน C ใน Lua เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
ภาพรวม
สามารถเปิดเผยฟังก์ชัน C ให้สคริปต์ Lua เรียกใช้ได้ ฟังก์ชันเหล่านี้ต้องมีรูปแบบลายเซ็นเป็น int myFunc(lua_State *L) โดยอ่านอาร์กิวเมนต์จากสแตกและส่งค่าผลลัพธ์ขึ้นสแตก
ลายเซ็นของฟังก์ชัน C
ทุกฟังก์ชันที่ Lua เรียกใช้ได้คือ lua_CFunction ซึ่งรับค่า lua_State* อ่านอาร์กิวเมนต์ ส่งผลลัพธ์ขึ้นสแตก และคืนจำนวนผลลัพธ์
// 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 ขึ้นสแตก จากนั้น 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
ลงทะเบียนฟังก์ชัน C หลายฟังก์ชันเป็นโมดูล Lua โดยใช้แถวลำดับ luaL_Reg และ luaL_newlib
// 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
การส่งค่าหลายค่ากลับ
ส่งค่าหลายค่าขึ้นสแตกและคืนจำนวนของค่าเหล่านั้น 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
คลอเชอร์ C จะเก็บอัปแวลูไว้ขณะลงทะเบียนโดยใช้ lua_pushcclosure(L, fn, n) เข้าถึงอัปแวลูด้วย lua_upvalueindex(n)
การรายงานข้อผิดพลาดจาก C
เรียกใช้ luaL_error(L, format, ...) เพื่อทำให้เกิดข้อผิดพลาดของ Lua จากฟังก์ชัน C ฟังก์ชันนี้จะไม่คืนค่า แต่จะกระโดดแบบ longjmp ไปยังตัวจัดการการเรียกใช้ที่มีการป้องกัน
// C code
if (divisor == 0)
luaL_error(L, "division by zero at argument %d", 2);โมดูล C ในรูปแบบ .so/.dll
โมดูล C จะเปิดเผยฟังก์ชัน luaopen_modname ส่วน require ของ Lua จะโหลดไลบรารีที่ใช้ร่วมกันและเรียกฟังก์ชันนี้เพื่อเริ่มต้นโมดูล
// 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
FFI ของ LuaJIT ช่วยให้คุณเรียกใช้ฟังก์ชัน C ได้โดยตรงจาก Lua โดยไม่ต้องเขียนโค้ดตัวห่อหุ้ม C มักเรียบง่ายกว่าสำหรับการเรียกใช้ฟังก์ชันโดยตรง แต่ C API ยังจำเป็นสำหรับการผสานรวมในระดับลึก
คำถามเกี่ยวกับฟังก์ชัน C
ฟังก์ชัน C ที่ Lua เรียกใช้ได้ต้องคืนค่าอะไร
ทบทวน: การลงทะเบียนฟังก์ชัน C
ฟังก์ชัน C ที่ Lua เรียกใช้ได้มีลายเซ็นเป็น int f(lua_State*) อ่านอาร์กิวเมนต์ด้วย luaL_check* ส่งผลลัพธ์ขึ้นสแตก และคืนจำนวนผลลัพธ์ ลงทะเบียนทีละฟังก์ชันด้วย lua_pushcfunction หรือลงทะเบียนเป็นชุดด้วย luaL_newlib
คำถามที่พบบ่อย
บทเรียน “การลงทะเบียนฟังก์ชัน C ใน Lua” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การลงทะเบียนฟังก์ชัน C ใน Lua” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การลงทะเบียนฟังก์ชัน C ใน Lua”
เปิดให้สคริปต์ Lua เรียกใช้ฟังก์ชัน C ด้วย luaL_register และ lua_pushcfunction คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การลงทะเบียนฟังก์ชัน C ใน Lua” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แบบจำลองสแตกของ Lua C API
- การเรียกฟังก์ชัน Lua จาก C
- การลงทะเบียนฟังก์ชัน C ใน Lua
- การจัดการสถานะและข้อผิดพลาด