我只写简单的!
lua版本 5.1.4
环境 ubuntu 12.04
从C/C++调用lua中自定义的函数 #include <lua.hpp> #include <iostream> using namespace std ;int main (int argc, const char * argv[]) { lua_State *L = luaL_newstate(); luaopen_base(L); luaL_openlibs(L); int ret = luaL_dofile(L, "test.lua" ); if (ret != 0 ) { cout << "load test.lua failed" << endl ; return 1 ; } lua_getglobal(L, "showValue" ); lua_pushstring(L, "W" ); lua_pushstring(L, "HH" ); lua_pcall(L, 2 , 0 , 0 ); lua_close(L); return 0 ;c++ }
test.lua文件:
function showValue (strFirstName, strLastName) print (strFirstName .. "." .. strLastName) end
从lua中返回一个值给C/C++ main.cpp,注意lua_pcall中设置了返回3个值
#include <lua.hpp> #include <iostream> using namespace std ;int main (int argc, const char * argv[]) { lua_State *L = luaL_newstate(); luaopen_base(L); luaL_openlibs(L); int ret = luaL_dofile(L, "test.lua" ); if (ret != 0 ) { cout << "load test.lua failed" << endl ; return 1 ; } lua_getglobal(L, "showValue" ); lua_pushstring(L, "W" ); lua_pushstring(L, "HH" ); lua_pcall(L, 2 , 3 , 0 ); int nOld = lua_tonumber(L, -1 ); const char *pIs = lua_tostring(L, -2 ); const char *pName = lua_tostring(L, -3 ); cout << pName << " " << pIs << " " << nOld << endl ; lua_pop(L, 3 ); lua_close(L); return 0 ; }
test.lua文件返回了3个值
function showValue (strFirstName, strLastName) strName = strFirstName .. "." .. strLastName print (strName) return strName, "is" , 18 end
Lua调用C/C++中自定义的函数 Lua不能调用任意的C/C++函数。可以向Lua中注册的函数,需要符合以下的规范:typedef int (*lua_CFunction) (lua_State *L);
main.cpp,定义了一个名为lua_printValue的函数,并且注册为PrintValue的lua函数,以便于在Lua中使用。
#include <lua.hpp> #include <iostream> using namespace std ;int lua_printValue (lua_State *L) { const char *pValue = lua_tostring(L, -1 ); lua_pushstring(L, pValue); lua_pushstring(L, "Year" ); return 2 ; } int main (int argc, const char * argv[]) { lua_State *L = luaL_newstate(); luaopen_base(L); luaL_openlibs(L); lua_pushcfunction(L, lua_printValue); lua_setglobal(L, "PrintValue" ); int ret = luaL_dofile(L, "test.lua" ); if (ret != 0 ) { cout << "load test.lua failed" << endl ; return 1 ; } lua_getglobal(L, "showValue" ); lua_pushstring(L, "W" ); lua_pushstring(L, "HH" ); lua_pcall(L, 2 , 3 , 0 ); int nOld = lua_tonumber(L, -1 ); const char *pIs = lua_tostring(L, -2 ); const char *pName = lua_tostring(L, -3 ); cout << pName << " " << pIs << " " << nOld << endl ; lua_pop(L, 3 ); lua_close(L); return 0 ; }
test.lua文件:
function showValue (strFirstName, strLastName) strName = strFirstName .. "." .. strLastName strThis, strYear = PrintValue("this" ) strAge = strThis .. " " .. strYear .. " is" return strName, strAge, 18 end
PrintValue从Lua中接受一个参数,在C/C++中处理了一下,返回两个参数给Lua。