来源于http://wenku.baidu.com/view/53e0b503763231126edb113c.html
按照示例代码测试了一下可行。
function.lua如下:
function add(a, b)
local sum = a + b
return sum
end
z = 12
b = 15
avg,sum = average(10,20,30,40,50)
print("average is ", avg, " . sum is ", sum)
c/c++程序如下:
#include <stdio.h>
extern "C" //如果文件后缀为.c, 则去掉extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
/* Lua解释器指针 */
lua_State* L;
//call func in lua script....
int luaadd(int x, int y)
{
int sum;
lua_getglobal(L, "add");
lua_pushnumber(L, x);
lua_pushnumber(L, y);
lua_call(L, 2, 1); //2个参数, 1个返回值
sum = (int)lua_tonumber(L, -1);
lua_pop(L, 1);
return sum;
}
//get && set global var in lua script
int luagetglobalv(char *z)
{
int v;
lua_getglobal(L, z);
v = (int)lua_tonumber(L, 1);
lua_pop(L, 1);
return v;
}
int luasetglobalv(char *z, int newv)
{
lua_pushnumber(L, newv);
lua_setglobal(L, z);
return 0;
}
//call c/c++ func from lua script
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 arg for average");
lua_error(L);
return 1; ////////!!!!!!!!!!这里弹栈不正确。。。 暂时还不清楚到底该怎么弹。。
}
sum += lua_tonumber(L, i);
}
lua_pushnumber(L, sum/n);
lua_pushnumber(L, sum);
return 2; //return num of results
}
int main ( int argc, char *argv[] )
{
/* 初始化Lua */
L = lua_open();
/* 载入Lua基本库 */
luaL_openlibs(L);
/* 运行脚本 */
lua_register(L, "average", average);
luaL_dofile(L, "C:\\Users\\xx\\Documents\\lua\\function.lua");
int sum = luaadd(10, 15);
printf("add result is :%u, z:%u, b:%u\n", sum, luagetglobalv("z"), luagetglobalv("b"));
luasetglobalv("z", 102);
printf("cur value of z:%u\n", luagetglobalv("z"));
/* 清除Lua */
lua_close(L);
/* 暂停 */
printf( "Press enter to exit…" );
getchar();
return 0;
}