Call C ++ from Lua

4

I would like to know if there is a way to do a moon extension with a C ++ library, that is, the moon script accessing functions in C ++.

Ex: add.lua file

-- add two numbers

function add ( x, y )

    CHAMAR AQUI uma função de uma biblioteca C++!

    return x + y

end

Thank you.

    
asked by anonymous 15.07.2015 / 21:00

1 answer

1

First of all in your C or C ++ code you should declare this function with the specific syntax for integration with the LUA.

The header "lua.h" defines the lua_CFunction prototype as follows:

typedef int (*lua_CFunction) (lua_State *L);

That is, you must declare your function with a return of integer (int) and receive a single parameter, a pointer to the lua_state structure.

We will take as an example a function to print a message:

void escrever_mensagem(const char* mensagem)
{
    std::cout << mensagem << std::endl;
}

In order for this function to be accessible by LUA we must implement an interface to the specified function just above it as follows:

int escrever_mensagem_lua(lua_State* lua_ptr)
{
    //Obtém o último argumento diretamente da pilha (stack) e
    // o converte para o tipo string (const char*)
    const char* mensagem = lua_tostring(lua_ptr, 1);

    //Faz a chamada para a função previamente declarada
    escrever_mensagem(mensagem);

    //Retorno 0 indica que a função foi executada com sucesso.
    return 0;
}

This is done by exposing the interface that we created to the LUA code, as follows:

//Inicia o interpretador LUA em um novo estado.
lua_State* lua_ptr = luaL_newstate();

//Carrega as bibliotecas padrão de LUA
luaL_openlibs(lua_ptr);

//Considerando um script chamado "funcao_em_c.lua"
if (luaL_loadfile(lua_ptr, "funcao_em_c.lua")) 
{
    std::cerr << "Falha ao carregar o script!";
}

//Expoe a interface "escrever_mensagem_lua" declarada em C para o script LUA
lua_pushcfunction(lua_ptr, escrever_mensagem_lua);

//Define o nome pelo qual a interface será chamada em LUA para invocar a função
lua_setglobal(lua_ptr, "escrever_mensagem");

//Executa o script "funcao_em_c.lua"
lua_pcall(lua_ptr, 0, 0, 0);

Below is the code for the script "function_em_c.lua"

escrever_mensagem("Olá, mundo!")
escrever_mensagem("Posso concatenar strings com números:")
escrever_mensagem("Teste " .. 1)
escrever_mensagem("Posso efetuar cálculos:")
escrever_mensagem("Teste " .. 1 + 1)
Now, you can now use most of the advantages of LUA combined with the power of C or C ++.

Note: This response is an adaptation and simplification of the content of this link in English.

All rights reserved to the author of the original code.

    
05.07.2016 / 06:55