美文网首页Lua Web开发
大话C与Lua(三)我是这样注入C函数的

大话C与Lua(三)我是这样注入C函数的

作者: 水果糖的小铺子 | 来源:发表于2018-01-12 10:12 被阅读0次

    Lua 使用 luaL_openlibs 这个API来注入所有内置库。

    而自己用C实现的Lua第三方库是通过类似 luaopen_xxx这样的接口函数来进行加载,然后通过lua脚本内调用:

    local xxx = require "xxx"
    

    本文介绍在创建Lua state时直接注入到Lua state 内的方法。

    main.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <lua.h>
    #include <lualib.h>
    #include <lauxlib.h>
    
    int ladd(lua_State* L){
        double x = luaL_checknumber(L,-2);
        double y = luaL_checknumber(L,-1);
        lua_pushnumber(L,x + y);
        return 1;
    }
    
    
    int lsub(lua_State* L){
        double x = luaL_checknumber(L,-2);
        double y = luaL_checknumber(L,-1);
        lua_pushnumber(L,x - y);
        return 1;
    }
    
    
    const luaL_Reg mylib[] = {
        {"add",ladd},
        {"sub",lsub},
        {NULL,NULL}
    };
    
    int main()
    {
        lua_State* L = luaL_newstate();
        luaL_openlibs(L);
        luaL_newlib(L,mylib);
        lua_setglobal(L,"cmath");
        printf("——————开始运行脚本——————\n");
        if(0!= luaL_loadfile(L, "main.lua")){
            printf("加载lua脚本错误:\n%s\n",luaL_checkstring(L,-1));
            exit(0);
        }
        if(0!= lua_pcall(L,0,0,0)){
            printf("初始化lua脚本错误:\n%s\n",luaL_checkstring(L,-1));
        }
        printf("——————脚本运行结束——————\n");
        lua_close(L);
        return 0;
    }
    

    main.lua

    for k,v in pairs(cmath) do
        print(k,v)
    end
    print(cmath.add(1,2))
    print(cmath.sub(1,2))
    

    运行结果:

    [root@localhost ~]# cc -o main main.c -Wall -O2 -ldl -lm -llua
    [root@localhost ~]# ./main 
    ——————开始运行脚本——————
    add function: 0x402030
    sub function: 0x401fe0
    3.0
    -1.0
    ——————脚本运行结束——————
    [root@localhost ~]# 
    

    从运行结果中,我们可以看到:

    首先我们在虚拟栈上创建了一张表,然后注入2个函数(add,sub)。

    由于这张表未命名。我们为其命名为:"cmath" 并从栈上弹出 。

    然后运行lua脚本,打印一下 cmath这个表。

    最后用add与sub函数做简单的运算。

    相关文章

      网友评论

        本文标题:大话C与Lua(三)我是这样注入C函数的

        本文链接:https://www.haomeiwen.com/subject/zlwxoxtx.html