dimanche 6 décembre 2015

L.es bibliothèques statiques Lua sont écrits en C, vous devez les importer en tant que telle:


Utilisation Lua avec C ++
Un court tutoriel
Par Christian Larsen Stigen
20 octobre 2006, mis à jour le 1 décembre 2013
Utilisation de Lua est facile! Dans ce court tutoriel, nous allons montrer comment écrire un programme d'accueil entièrement fonctionnel en C ++ avec rappels Lua.
Depuis les bibliothèques statiques Lua sont écrits en C, vous devez les importer en tant que telle:

extern "C" { #include "lua.h" } int main() { lua_State *L = lua_open(); lua_close(L); return 0; }
Il a été signalé que sur certains systèmes, vous devez inclure les en-têtes lualib.h et lauxlib.h pour compiler l'exemple ci-dessus:

extern "C" { #include "lualib.h" #include "lauxlib.h" }
Compilation et la liaison avec GNU g ++:

$ g++ host.cpp -o host -Ilua-5.0.2/include/ -Llua-5.0.2/lib/ -llua
Y compris lualib.h et lauxlib.h, il est facile d'écrire un hôte pleinement de travail:

#include extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" } void report_errors(lua_State *L, int status) { if ( status!=0 ) { std::cerr << "-- " << lua_tostring(L, -1) << std::endl; lua_pop(L, 1); // remove error message } } int main(int argc, char** argv) { for ( int n=1; n extern "C"{ #include "lua.h" #include "lualib.h" #include "lauxlib.h" } int my_function(lua_State *L) { int argc = lua_gettop(L); std::cerr << "-- my_function() called with " << argc << " arguments:" << std::endl; for ( int n=1; n<=argc; ++n ) { std::cerr << "-- argument " << n << ": " << lua_tostring(L, n) << std::endl; } lua_pushnumber(L, 123); // return value return 1; // number of return values } void report_errors(lua_State *L, int status) { if ( status!=0 ) { std::cerr << "-- " << lua_tostring(L, -1) << std::endl; lua_pop(L, 1); // remove error message } } int main(int argc, char** argv) { for ( int n=1; n/dev/null Running Lua 5.0.2 my_function() returned 123
Prochaines étapes
Suggestions pour les prochaines étapes seraient à étudier comment faire pour que les fermetures de Lua intègrent parfaitement avec votre programme hôte.

Si vous écrivez des programmes sans consoles, alors vous voudrez probablement piège io.write() Je l'ai fait en copiant le code de lualib.c et changer io_write pour pointer vers mon propre fonction. Cela peut être utile pour la programmation de jeux ou de plaine applications X / Windows où vous voulez attraper sortie.

Utilisation RAII
Aussi, je vous recommande d'utiliser la technique d'acquisition de ressources-est-initialisation (RAII) dans laquelle les ressources sont allouées dans un constructeur et libérés dans le destructeur. Utilisation de la surcharge d'opérateur, nous pouvons élégamment masquer les détails:

#include extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" } class Lua_State { lua_State *L; public: Lua_State() : L(lua_open()) { } ~Lua_State() { lua_close(L); } // implicitly act as a lua_State pointer inline operator lua_State*() { return L; } }; static void open_libs(lua_State *L) { luaopen_io(L); luaopen_base(L); luaopen_table(L); luaopen_string(L); luaopen_math(L); luaopen_loadlib(L); } static int execute_program(lua_State *L) { // make a short function to make program behaviour more clear return lua_pcall(L, 0, LUA_MULTRET, 0); } static void report_errors(lua_State *L, const int status) { if ( status!=0 ) { std::cerr << "-- " << lua_tostring(L, -1) << std::endl; lua_pop(L, 1); // remove error message } } int main(int argc, char** argv) { for ( int n=1; n

Aucun commentaire:

Enregistrer un commentaire