2010-04-25 3 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

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.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() может быть использован, чтобы положить функции C в любой таблице, передавая NULL для своего второго параметра, пока таблица находится на вершине стека.

+0

Если уже есть таблица мод с другими полями, она будет расширена или заменена новой после вызова luaL_register()? –

+0

он будет повторно использовать и обновлять предыдущую таблицу, в соответствии с руководством 5.1. – u0b34a0f6ae

+0

Независимо от того, применяется ли она к названной глобальной таблице или таблице в верхней части стека, она только устанавливает те поля, имена которых указаны в списке функций для регистрации, и оставляет любые другие поля нетронутыми. Разница в том, что при глобальном имени он также создает таблицу, если это необходимо, и добавляет ссылку на 'package.loaded'. – RBerteig

Смежные вопросы