2010-04-25 67 views

回答

5
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 
} 
+4

为什么不使用luaL_register? – uroc 2010-04-26 13:31:07

20

这是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.amod.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函数中的任何表。

+0

如果已经有其他字段的mod table,它会在luaL_register()调用之后被扩展或替换为新的吗? – 2010-04-26 23:07:38

+0

根据5.1手册,它将重新使用和更新以前的表格。 – u0b34a0f6ae 2010-04-27 10:21:54

+0

无论是应用于指定的全局表还是应用于堆栈顶部的表,它只会设置函数列表中指定的那些字段进行注册,并保留其他任何字段不变。区别在于给定全局名称,如果需要,还会创建表并添加对'package.loaded'的引用。 – RBerteig 2010-04-28 02:03:15