Cách đăng ký một hàm C trong Lua, nhưng không phải trong ngữ cảnh chung, mà là một trường bảng?Đăng ký chức năng C trong bảng Lua
Trả lời
void register_c_function(char const * const tableName, char const * const funcName, CFunctionSignature funcPointer)
{
lua_getfield(lstate, LUA_GLOBALSINDEX, tableName); // push table onto stack
if (!lua_istable(lstate, -1)) // not a table, create it
{
lua_createtable(lstate, 0, 1); // create new table
lua_setfield(lstate, LUA_GLOBALSINDEX, tableName); // add it to global context
// reset table on stack
lua_pop(lstate, 1); // pop table (nil value) from stack
lua_getfield(lstate, LUA_GLOBALSINDEX, tableName); // push table onto stack
}
lua_pushstring(lstate, funcName); // push key onto stack
lua_pushcfunction(lstate, funcPointer); // push value onto stack
lua_settable(lstate, -3); // add key-value pair to table
lua_pop(lstate, 1); // pop table from stack
}
Đây là những gì luaL_register()
được thiết kế để thực hiện, cho một hoặc nhiều chức năng. Việc sử dụng kinh điển là như một phần của thiết lập cho một module viết bằng C:
/* actual definitions of modA() and modB() are left as an exercise. */
/* list of functions in the module */
static const luaL_reg modfuncs[] =
{
{ "a", modA},
{ "b", modB},
{ NULL, NULL }
};
/* module loader function called eventually by require"mod" */
int luaopen_mod(lua_State *L) {
luaL_register(L, "mod", modfuncs);
return 1;
}
nơi này tạo ra một module có tên là "mod" rằng có hai chức năng đặt tên mod.a
và mod.b
.
Trích dẫn hướng dẫn cho luaL_register(L,libname,l)
:
Khi gọi với
libname
bằngNULL
, nó chỉ đơn giản đăng ký tất cả chức năng trong danh sáchl
(xemluaL_Reg
) vào bảng trên đỉnh của chồng .Khi được gọi với một tổ chức phi-null
libname
,luaL_register
tạo ra một bảng mớit
, bộ nó như là giá trị của toàn cầu biếnlibname
, đặt nó như là giá trị củapackage.loaded[libname]
, và thanh ghi trên đó tất cả các chức năng trong danh sáchl
. Nếu có một bảng trongpackage.loaded[libname]
hoặc trong biếnlibname
, hãy sử dụng lại bảng này thay vì tạo bảng mới.Trong mọi trường hợp, hàm sẽ để lại bảng trên đầu ngăn xếp.
luaL_register()
có thể được sử dụng để đặt hàm C trong bất kỳ bảng nào bằng cách chuyển NULL
cho tham số thứ hai miễn là bảng nằm trên cùng của ngăn xếp.
Nếu đã có bảng mod với các trường khác, nó sẽ được mở rộng hoặc thay thế bằng một bảng mới sau khi gọi luaL_register()? –
nó sẽ tái sử dụng và cập nhật một bảng trước đó, theo hướng dẫn 5.1. – u0b34a0f6ae
Dù được áp dụng cho một bảng toàn cầu có tên hoặc bảng ở trên cùng của ngăn xếp, nó chỉ đặt những trường được đặt tên trong danh sách hàm để đăng ký và để lại bất kỳ trường nào khác bị ảnh hưởng. Sự khác biệt là cho một tên toàn cầu, nó cũng tạo ra bảng nếu cần và thêm một tham chiếu đến 'package.loaded'. – RBerteig
- 1. Calling Lua chức năng
- 2. Chức năng tạo trong Lua
- 3. Safe Lua gọi hàm C++ đã đăng ký
- 4. Lặp lại bảng lua bằng c với chức năng ghép nối tùy chỉnh
- 5. Đăng ký chức năng CLR (WCF) trong SQL Server 2012
- 6. Làm cách nào để hủy đăng ký chức năng đã đăng ký trong loại trực tiếp?
- 7. Lua - tìm ra chức năng gọi
- 8. Làm cách nào để tạo Bảng Lua trong C++ và chuyển nó sang hàm Lua?
- 9. bạn có ý nghĩa gì khi đăng ký chức năng gọi lại trong C?
- 10. C++ nhớ bảng chức năng ảo tốn
- 11. Đăng ký chức năng Trợ giúp Node.JS + Express
- 12. bảng bên trong bảng trong Lua
- 13. Kiểm tra xem chức năng có trong C hoặc Lua được triển khai
- 14. danh sách các chức năng tắt máy đã đăng ký
- 15. Gọi chức năng Lua mà không thực hiện kịch bản
- 16. chức năng ẩn trong C
- 17. Cách đăng ký System.DirectoryServices để sử dụng trong SQL CLR Chức năng người dùng?
- 18. Truy cập chức năng băm chuỗi tích hợp của Lua
- 19. Các chức năng Chưa xác định và Ẩn danh Lua
- 20. khai C chức năng trong một chức năng
- 21. Anonymous chức năng tốc ký
- 22. chức năng alloca trong C
- 23. Chức năng opcode trong C
- 24. chức năng ambigious trong C++
- 25. Chức năng srand trong C++
- 26. Chức năng MATLAB trong C++
- 27. chức năng Left trong C#
- 28. Tham chiếu đến hàm Lua trong C/C++
- 29. Đăng ký cùng chức năng chặn và xử lý cuộc gọi Unity cho tất cả các loại đăng ký
- 30. Lập trình chức năng trong C/C++?
Tại sao không chỉ sử dụng luaL_register? – uroc