一、C++代码 /************************************************************************ 编译步骤: 1、创建一个新的空Win32控制台应用工程。 2、将"luatest.cpp"加入你的工程。 3、选择项目菜单中的属性菜单。 4、在"连接器"的"输入"栏目的"附加依赖项"中输入"lua5.1.lib"。 5、确定。 ************************************************************************/ #include <stdio.h> #include <stdlib.h> // 如果是C代码,将extern "C"去掉 extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" }; // lua解释器指针 lua_State* L; #if 0 // C++执行lua脚本 /************************************************************************ 1、lua_open()返回一个指向Lua解释器的一个指针。 2、luaL_openlibs()用于装载Lua库,它提供了一些简单的函数,如:print。 3、通过调用luaL_dofile()执行脚本。它的作用是读取并解释脚本。 4、最后,通过lua_close()函数关闭Lua。 ************************************************************************/ int main(int argc, char **argv) { L = lua_open();// 打开lua luaL_openlibs(L);// 打开lua库 luaL_dofile(L, "test.lua");// 执行lua脚本 lua_close(L);// 关闭lua system("pause"); return 0; } #endif #if 0 // C++ 调用Lua函数 /************************************************************************ 1、调用lua_getglobal()将add()函数压入栈中。 2、调用lua_pushnumber()将第一个参数x压入栈中。 3、同样,调用lua_pushnumber()将第二个参数y压入栈中。 4、调用lua_call(),其参数的意思是两个参数,一个返回值。 5、现在,我们可以利用lua_tointeger()获得整型返回值。 6、最后,调用lua_pop()将值从栈中移出。 ************************************************************************/ int luaadd(int x, int y) { int sum; lua_getglobal(L, "add");// 根据函数名获得Lua中的函数 lua_pushnumber(L, x);// 参数一入栈 lua_pushnumber(L, y);// 参数二入栈 lua_call(L, 2, 1);// 调用lua中的add函数,连个输入参数,一个返回值 sum = (int )lua_tointeger(L, -1);//获得返回值 lua_pop(L, 1);// 将返回值出栈,恢复栈中的元素 return sum; } int main(int argc, char **argv) { int sum; L = lua_open();// 打开lua luaL_openlibs(L);// 打开lua库 luaL_dofile(L, "test.lua");// 加载lua脚本 sum = luaadd(10, 15);// 调用lua中的函数 printf("Result is: %d./n", sum); lua_close(L);// 关闭lua system("pause"); return 0; } #endif #if 1 // lua调用C++的函数 /************************************************************************ 1、lua_gettop函数返回栈顶的索引值。因为在Lua中栈是从1开始编号的,因此该函 数获得的值就是参数的个数。 2、在for循环中计算所有参数之和。 3、调用lua_pushnumber()将参数的平均值压栈。 4、将参数之和压入栈中。 5、最后,函数返回2,说明有两个返回值在栈中。 ************************************************************************/ 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); } else { sum += lua_tonumber(L, i); } } lua_pushnumber(L, sum/n);// 将平均数压入栈顶 lua_pushnumber(L, sum);// 将和压入栈中 return 2;// 返回压入栈中参数的个数 } int main(int argc, char **argv) { int sum; L = lua_open();// 打开lua luaL_openlibs(L);// 打开lua库 lua_register(L, "average", average);// 注册lua基本库,绑定之 luaL_dofile(L, "test.lua");// 加载lua脚本 lua_close(L);// 关闭lua system("pause"); return 0; } #endif 二、Lua代码 --C++ dofile print("Hello world!"); --Be called by C++ function add(x, y) return x - y; end --call C++ function avg, sum = average(23,56,46,24,65,75,34,12); print("The average is : ", avg); print("The sum is : ", sum);