// TestLua.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <string>
#include <iostream>
extern "C"{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
};
using namespace std;
lua_State* L;
//接口方法
static int Lua_Average(lua_State* lua)
{
int n = lua_gettop(lua); //返回战中元素的个数
float sum = 0;
int i = 1;
for(i; i <= n; i++)
{
if(!lua_isnumber(lua, i))
{
lua_pushstring(L,"**** there has a error, argument has not number");
lua_error(lua);
}
sum += lua_tonumber(lua, i);
}
lua_pushnumber(lua, sum/n); //将数值返回lua
lua_pushnumber(lua, sum);
return 2;
}
int _tmain(int argc, _TCHAR* argv[])
{
//初始化lua
L = luaL_newstate();
luaL_openlibs(L);
//函数注册
lua_register(L,"Average", Lua_Average);
//加载lua脚本, 脚本放在工程目录下
luaL_loadfile(L, "testA.lua");
int dwError = lua_pcall(L, 0 ,LUA_MULTRET,0);
if(dwError != 0)
{
cout<<lua_tostring(L,-1);
lua_close(L);
return 1;
}
lua_getglobal(L, "avg");
cout<<"avg is "<<lua_tostring(L, -1) << endl;
lua_pop(L, 1);
lua_getglobal(L,"sum");
cout<<"sum = "<<lua_tointeger(L,-1)<<endl;
lua_pop(L, 1);
//调用 lua中的函数
int a = 10;
int b = 11;
lua_getglobal(L,"SumFunc");
lua_pushinteger(L,a);
lua_pushinteger(L,b);
int dwRet = lua_pcall(L,2,1,0);
if(dwRet != 0)
{
cout<<lua_tostring(L, -1);
lua_pop(L,1);
return 0;
}
printf("sum: %d + %d = %ld\n", a,b,lua_tointeger(L,-1));
lua_pop(L,-1);
//调用结束,清除Lua
lua_close(L);
return 0;
}
Lua 脚本
function SumFunc( a, b)
<span style="white-space:pre"> </span>return a + b;
end
avg, sum = Average(10, 20, 30, 40, 50)
print("The average is ", avg)
print("The sum is ", sum)
注:
1. c++中的函数注册最好是在lua脚本加载之前完成注册,否则lua 文件如果在加载后就调用c++中的函数时会报错