如何在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