2010-04-25 17 views

risposta

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

Perché non usare solo luaL_register? – uroc

20

Questo è ciò che luaL_register() è destinato a fare, per una o più funzioni. L'utilizzo canonica è come parte della configurazione per un modulo scritto in 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; 
} 

dove questo crea un modulo denominato "mod" che ha due funzioni denominate mod.a e mod.b.

Citando il manuale luaL_register(L,libname,l):

Quando chiamato con libname pari a NULL, registra semplicemente tutte funzioni incluse nell'elenco l (vedi luaL_Reg) nella tabella in cima alla pila .

Quando chiamato con un non-null libname, luaL_register crea una nuova tabella t, imposta come valore della globale variabile libname, imposta come valore di package.loaded[libname] e registri su di esso tutte le funzioni nell'elenco l. Se esiste una tabella in package.loaded[libname] o nella variabile libname, riutilizza questa tabella anziché creando una nuova.

In ogni caso la funzione lascia la tabella in cima alla pila.

luaL_register() possono essere usati per mettere funzioni C in qualsiasi tabella passando NULL per il suo secondo parametro finché la tabella è in cima alla pila.

+0

Se esiste già una tabella mod con altri campi, verrà estesa o sostituita con una nuova dopo la chiamata a luaL_register()? –

+0

riutilizzerà e aggiornerà una tabella precedente, secondo il manuale 5.1. – u0b34a0f6ae

+0

Se applicato a una tabella globale denominata o alla tabella in cima allo stack, imposta solo i campi nominati nell'elenco di funzioni da registrare e lascia intatti altri campi. La differenza è che, dato un nome globale, crea anche la tabella se necessario e aggiunge un riferimento a 'package.loaded'. – RBerteig