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.