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

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

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

local xxx = require "xxx"

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

main.c

#include 
#include 
#include 
#include 
#include 

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函数的)