如何在Lua中註冊一個C函數,但不是在全局上下文中,而是作爲表字段?在Lua表中註冊C函數
回答
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
}
這是luaL_register()
打算做的,用於一個或多個功能。該規範的用法是作爲設置爲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;
}
,其中這將創建一個名爲「國防部」模塊,該模塊有一個名爲mod.a
和mod.b
兩種功能。
引述手冊luaL_register(L,libname,l)
:
當與
libname
等於叫NULL
,它簡單地登記在列表中的所有 功能l
(見luaL_Reg
) 到表上 堆棧的頂部。它的所有功能當與非空
libname
叫,luaL_register
創建新表t
, 將其設置全局 變量libname
的值,將其設置爲值package.loaded[libname]
和 寄存器在 列表l
。如果在package.loaded[libname]
或變量libname
中有表格,則重新使用此表格而不是 創建一個新表格。在任何情況下,函數都會將表放在堆棧頂部。
luaL_register()
可以通過傳遞NULL
其第二參數,只要該表是在堆疊的頂部用來放C函數中的任何表。
如果已經有其他字段的mod table,它會在luaL_register()調用之後被擴展或替換爲新的嗎? – 2010-04-26 23:07:38
根據5.1手冊,它將重新使用和更新以前的表格。 – u0b34a0f6ae 2010-04-27 10:21:54
無論是應用於指定的全局表還是應用於堆棧頂部的表,它只會設置函數列表中指定的那些字段進行註冊,並保留其他任何字段不變。區別在於給定全局名稱,如果需要,還會創建表並添加對'package.loaded'的引用。 – RBerteig 2010-04-28 02:03:15
- 1. 安全Lua調用C++註冊函數
- 2. 在Lua中註冊相同簽名的C函數
- 3. 註冊表GetValue函數
- 4. C++和Lua:自動註冊功能
- 5. 我怎樣才能在Lua註冊一個C++類和函數5.3
- 6. 閱讀與lua的Windows註冊表
- 7. 尋求一個「弱的Lua註冊表」
- 8. 在C/C++中引用Lua函數
- 9. Lua:函數表
- 10. 從註冊表中獲取數據[C#]
- 11. dajaxice註冊函數
- 12. C/C + +註冊表幫助
- 13. 如何在C中導出註冊表#
- 14. 無法在c#中編輯註冊表?
- 15. 在Pascalscript中註冊DLL函數
- 16. 黑客Lua - 注入新的函數到內置的Lua中
- 17. 在C#中使用P/Invoke註冊_set_purecall_handler函數
- 18. 如何在C++中創建Lua表並將其傳遞給Lua函數?
- 19. 在註冊表
- 20. Lua C API和metatable函數
- 21. lua userdata C++析構函數
- 22. C++添加註冊表項
- 23. C++ Windows註冊表編輯
- 24. 註冊表getValue與C#
- 25. C#註冊表問題
- 26. C#註冊表導入
- 27. C#註冊表設置
- 28. 尋找C#註冊表類
- 29. C++搜索Windows註冊表
- 30. C++添加到註冊表
爲什麼不使用luaL_register? – uroc 2010-04-26 13:31:07