Не существует специальной функции для запроса модулей Lua из C-API. [1] Поэтому я ориентировался на функцию dolibrary
в интерпретаторе Lua для реализации require
, которая просто вызывает функцию Lua require
из C.
NB: Я не рекомендую общаться с модулями путем обмена глобальными переменными, особенно когда порядок загрузки модулей имеет значение, как здесь. Лучше предоставить методы A.update_num(old)
и B.update_num(old)
, которые берут старое значение num
в качестве аргумента и возвращают обновленное значение.
#include
#include
int require(lua_State *L, char const * modname) {
int const size = lua_gettop(L);
lua_getglobal(L, "require");
lua_pushstring(L, modname);
if (lua_pcall(L, 1, LUA_MULTRET, 0) != 0) {
std::cerr << "lua:" << lua_tostring(L, 1) << '\n';
lua_pop(L,1);
return 0; // Failed, nothing should be on the stack
}
return lua_gettop(L) - size;
}
int main() {
lua_State *L = luaL_newstate();
luaL_openlibs(L);
require(L, "A");
require(L, "B");
lua_close(L);
}
С помощью скриптов из вашего вопроса в том же каталоге мы получаем :
$ clang++ -Wall -Wextra -Wpedantic -I /usr/include/lua5.2/ test.cpp -llua5.2
$ ./a.out
5
[1] Для использования модулей Lua C из C-API существует lua_requiref
.