0Pricing
Lua Academy · บทเรียน

การลงทะเบียนฟังก์ชัน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แบบจำลองสแตกของ Lua C API
  2. การเรียกฟังก์ชัน Lua จาก C
  3. การลงทะเบียนฟังก์ชัน C ใน Lua
  4. การจัดการสถานะและข้อผิดพลาด
← กลับไปที่ Lua Academy