一. lua调用C++
在lua中是以函数指针的形式调用函数, 并且所有的函数指针都必须满足如下此种类型:
typedef int (*lua_CFunction) (lua_State *L);
也就是说, 偶们在C++中定义函数时必须以lua_State为参数, 以int为返回值才能被Lua所调用. 但是不要忘记了, 偶们的lua_State是支持栈的, 所以通过栈可以传递无穷个参数, 大小只受内存大小限制. 而返回的int值也只是指返回值的个数真正的返回值都存储在lua_State的栈中. 偶们通常的做法是做一个wrapper, 把所有需要调用的函数都wrap一下, 这样就可以调用任意的函数了.
#include using namespace std; #include extern "C" { #include #include #include } //#pragma comment(lib, "lua5.1.lib") lua_State* L; static int average(lua_State *L) { //返回栈中元素的个数 int n = lua_gettop(L); double sum = 0; int i; for (i = 1; i <= n; i++) { if (!lua_isnumber(L, i)) { lua_pushstring(L, "Incorrect argument to 'average'"); lua_error(L); } sum += lua_tonumber(L, i); } /* push the average */ lua_pushnumber(L, sum / n); /* push the sum */ lua_pushnumber(L, sum); /* return the number of results */ return 2; } int main (int argc,char*argv[]) { /* initialize Lua */ L = lua_open(); /* load Lua libraries */ luaL_openlibs(L); /* register our function */ lua_register(L, "average", average); /* run the script */ luaL_dofile(L, "e15.lua"); lua_getglobal(L,"avg"); cout<<"avg is:"<
脚本为
avg, sum = average(10, 20, 30, 40, 50)
print("The average is ", avg)
print("The sum is ", sum)
二. C++调用lua
#include "stdafx.h" #include extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" } /* Lua解释器指针 */ lua_State* L; int main ( int argc, char *argv[] ) { /* 初始化Lua */ L = lua_open(); /* 载入Lua基本库 */ luaL_openlibs(L); /* 运行脚本 */ luaL_dofile(L, "Lua1.lua"); /* 清除Lua */ lua_close(L); /* 暂停 */ printf( "Press enter to exit…" ); getchar(); return 0; }
/* A simple Lua interpreter. */ #include extern "C" { #include #include #include } #include extern "C" { // 这是个C++程序, 所以要extern "C", // 因为lua的头文件都是C格式的 #include "lua.h" #include "lualib.h" #include "lauxlib.h" } #pragma comment(lib, "lua5.1.lib") /* the Lua interpreter */ lua_State* L; int luaadd ( int x, int y ) { int sum; /* the function name */ lua_getglobal(L, "add"); int nTop = lua_gettop(L); //得到栈的元素个数。栈顶的位置。 /* the first argument */ lua_pushnumber(L, x); nTop = lua_gettop(L); /* the second argument */ lua_pushnumber(L, y); nTop = lua_gettop(L); /* call the function with 2 arguments, return 1 result */ lua_call(L, 2, 1); nTop = lua_gettop(L); /* get the result */ sum = (int)lua_tonumber(L, -1); nTop = lua_gettop(L); /*清掉返回值*/ lua_pop(L, 1); nTop = lua_gettop(L); /*取出脚本中的变量z的值*/ lua_getglobal(L, "z"); nTop = lua_gettop(L); int z = (int)lua_tonumber(L, 1);nTop = lua_gettop(L); lua_pop(L, 1); nTop = lua_gettop(L); //没调通 /*lua_pushnumber(L, 4); nTop = lua_gettop(L); lua_setglobal(L, "r"); nTop = lua_gettop(L); int r = (int)lua_tonumber(L, 1);nTop = lua_gettop(L);*/ return sum; } int main ( int argc, char *argv[] ) { int sum; /* initialize Lua */ L = lua_open(); /* load Lua base libraries */ //lua_baselibopen(L); /* load the script */ luaL_dofile(L, "e12.lua"); /* call the add function */ sum = luaadd( 10, 15 ); /* print the result */ printf( "The sum is %d", sum ); /* cleanup Lua */ lua_close(L); return 0; } /*程序说明: main中过程偶们上次已经说过了, 所以这次只说说luaadd的过程 * 首先用lua_getglobal()把add函数压栈 * 然后用lua_pushnumber()依次把x,y压栈 * 然后调用lua_call(), 并且告诉程序偶们有两个参数一个返回值 * 接着偶们从栈顶取回返回值, 用lua_tonumber() * 最后偶们用lua_pop()把返回值清掉 */
脚本为:
-- add two numbers
function add ( x, y )
return x + y + 2
end
z = 6