2019独角兽企业重金招聘Python工程师标准>>>
一、首先是准备Lua库,官方提供了5.1版库,但是由于官方的失误,导致存在2个dll文件,缺一不可,大麻烦。
好在Lua是开源的,我们可以自己编译。参看:http://my.oschina.net/u/580100/blog/108468
二、然后准备Lua代码文件,自己随便写个吧,比如下面这个求阶乘:test.lua
function func1 (n)
if n == 0 then
return 1
else
return n * func1 (n - 1)
end
end
三、具体在C语言中调用的细节如下:
1、包含头文件
#include "Lua\Lua.h"
#include "Lua\LuaLib.h"
#include "Lua\LauxLib.h"
2、创建 Lua 库指针,并加载库
pLua = luaL_newstate(); /* 创建Lua接口指针 */
if(pLua == NULL)
return 0;
luaL_openlibs(pLua); /* 加载Lua库 */
3、读取 Lua 代码文件
if(luaL_loadfile(pLua, "test.lua") != 0) /* 读取lua源文件,仅载入内存而未编译 */
return 0;
lua_pcall(pLua, 0, LUA_MULTRET, 0); /* 执行匿名函数,以编译源代码成二进制码 */
/* 并将全局变量压栈(函数名也是变量)。*/
/* 这句看似无用,但是不能省 */
lua_getglobal(pLua, "func1"); /* 取全局变量,这里是待调用函数名 */
4、调用函数,完成功能
lua_pushnumber(pLua, x); /* 参数压栈。x 为事先定义的变量 */
if(lua_pcall(pLua, 1, 1, 0) != 0) /* 执行函数 */
{
printf("\nError running function 'func1' : %s", lua_tostring(pLua, -1));
return 0;
}
r = lua_tonumber(pLua, -1); /* 取栈顶值,并转成数字格式。r 为事先定义的变量 */
lua_pop(pLua, 1); /* 栈顶弹出一个元素,即清除返回值占用的栈空间 */
这里值得一提的是 函数 lua_pcall 的参数,第二个是参数个数,第三个是返回值个数,第四个是个函数指针,我们始终置0。
5、最后记得清理
lua_close(pLua);
#include
#include
#include
#include
#include
int main()
{
int x;
long int r;
lua_State *pLua;
pLua = luaL_newstate(); /* 创建Lua接口指针 */
if(pLua == NULL)
return 0;
luaL_openlibs(pLua); /* 加载Lua库 */
if(luaL_loadfile(pLua, "test.lua") != 0) /* 读取lua源文件,仅载入内存而未编译 */
return 0;
lua_pcall(pLua, 0, LUA_MULTRET, 0); /* 执行匿名函数,以编译源代码成二进制码,*/
/* 并将全局变量压栈(函数名也是变量) */
lua_getglobal(pLua, "func1"); /* 取全局变量,这里是待调用函数名 */
printf("Enter a number (less than 13) : ");
scanf("%d", &x);
lua_pushnumber(pLua, x); /* 参数压栈 */
if(lua_pcall(pLua, 1, 1, 0) != 0) /* 执行函数 */
{
printf("\nError running function 'func1' : %s", lua_tostring(pLua, -1));
return 0;
}
r = lua_tonumber(pLua, -1); /* 取栈顶值,并转成数字格式 */
lua_pop(pLua, 1); /* 栈顶弹出一个元素,即清除返回值占用的栈空间 */
printf("%d! = %ld", x, r);
lua_close(pLua);
return 0;
}