引言 通過前幾篇,我們已經對Lua的C API有了一定的了解,如lua_push*、lua_is*、lua_to*等等。用C++調用Lua數據時,我們主要運用lua_getglobal與lua_push*配合以達到目的。現在我們來試試用Lua調用C++數據。 C++數據類型映射到Lua C++中數據類型有這麼幾種:1、內建的int、float等;2、指針,如void *、int *、int (*fun)(int, int)等;3、用戶自定義的class、strcut等。Lua中C API支持操作的數據類型有如下: image 見名知意,從他們的參數,我們就可以看出來他們的作用。比如:lua_pushlightuserdata用來將指針壓棧,lua_pushcclosure用來將函數壓棧,不一而足。通過這些API,我們可以將C++中的數據結構一一映射到Lua中。 Lua調用C++內置常用數據類型與函數 我們要將一個值,從C++傳入Lua,必須有兩個步驟:1、值是多少?通過lua_push*將值壓入棧頂,此時該值的類型與值的大小已確定;2、用什麼名字來引用該值?通過lua_setglobal來用一個名字引用棧頂的值。我們來按照這個步驟,嘗試一下將一個變量傳入Lua,代碼如下: #include <iostream> #include <fstream> #include <string> using namespace std; extern "C" { #include <lua.h> #include <lauxlib.h> #include <lualib.h> }; void TestLua2(); int main() { TestLua2(); return 0; } void TestLua2() { lua_State *L = luaL_newstate(); luaopen_base(L); // luaopen_table(L); // luaopen_package(L); // luaopen_io(L); // luaopen_string(L); // luaL_openlibs(L); //打開以上所有的lib int valueCPP = 1; // 將a值壓入棧頂 lua_pushnumber(L, valueCPP); // 命名棧頂的值 lua_setglobal(L, "valueCPP"); string str; while (true) { cout << "輸入lua文件路徑:" << endl; getline(cin, str, '\n'); if (luaL_loadfile(L, str.c_str()) || lua_pcall(L, 0, 0, 0) ) { const char * error = lua_tostring(L, -1) ; cout << string(error) << endl; } }