test.cpp文件
/*Lua调用C/C++函数/库(函数压栈方式)*/ #include<iostream> using namespace std; #include<lua.hpp> /* 当我们需要在Lua里面调用C/C++函数时,所有的函数都必须满足以下函数签名: typedef int (*lua_CFunction) (lua_State *L);换句话说,所有的函数必须接收一个lua_State作为参数,同时返回一个整数值。因为这个函数使用Lua栈作为参数,所以它可以从栈里面读取任意数量和任意类型的参数。而这个函数的返回值则表示函数返回时有多少返回值被压入Lua栈。(因为Lua的函数是可以返回多个值的) */ static int math_abs(lua_State *L) { lua_pushnumber(L,abs((int)luaL_checknumber(L,1))); //获取传入的参数 return 1; } static int math_cos(lua_State *L) { lua_pushnumber(L,cos((double)luaL_checknumber(L,1))); return 1; } static int math_sin(lua_State *L) { lua_pushnumber(L,sin((double)luaL_checknumber(L,1))); return 1; } static int ShowMessage(lua_State * L) { lua_pushnumber(L,1000); printf("show message and push 1000 \n"); return -1; } //注册函数 void regist_function(lua_State *L) { //压栈后设置一个lua可调用的全局函数名 lua_pushcfunction(L,ShowMessage); lua_setglobal(L,"showmessage"); //c调用lua lua_getglobal(L,"SHOWMESSAGE"); lua_pcall(L,0); printf("get the showmessage pushed value %f \n",lua_tonumber(L,-1)); //#define lua_register(L,n,f) (lua_pushcfunction(L,(f)),lua_setglobal(L,(n))) //lua_register的定义如上,所有 lua_pushcfunction(L,ShowMessage);lua_setglobal(L,"showmessage"); <==>lua_register(L,"showmessage",ShowMessage); lua_register(L,"cos",math_cos); //测试 lua_getglobal(L,"COS"); lua_pushnumber(L,0.5); if (0 != lua_pcall(L,1,0)) { printf("cpp call lua function Failed\n"); } printf("cos(0.5)=%f\n",-1)); lua_pop(L,1); } //注册库函数 void regist_lib(lua_State *L) { static const luaL_reg mathlib[] = { { "abs",math_abs },{ "cos",math_cos },{ "sin",math_sin },{ NULL,NULL } }; luaL_register(L,"DY_MATH",mathlib); //测试 double sinv = 30*3.1415926/180.0; lua_getglobal(L,"SIN"); lua_pushnumber(L,sinv); if (0 != lua_pcall(L,0)) { printf("cpp call lua function Failed\n"); } printf("sin(%f)=%f\n",sinv,1); } int main() { lua_State *L = luaL_newstate(); luaL_openlibs(L); char *luapath="LuaCallCTest.lua"; luaL_dofile(L,luapath); regist_function(L); regist_lib(L); lua_close(L); system("pause"); return 0; }
LuaCallCTest.lua文件
--region LuaCallCTest.lua function COS(a) print("called COS in lua script") --lua调用c/c++函数 return cos(a) end function SIN(a) print("called SIN in lua script") --lua调用c/c++库函数 return DY_MATH.sin(a) end function SHOWMESSAGE() showmessage() end --end region结果