C语言调用Lua

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、首先是准备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;
}

转载于:https://my.oschina.net/u/580100/blog/108544

你可能感兴趣的:(lua,c/c++,python)