zoukankan      html  css  js  c++  java
  • lua 调用 C -- 实例 C函数作为应用程序的一部分

    参考:https://blog.csdn.net/vermilliontear/article/details/50947379

    test2.c

    #include <stdarg.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <lua.h>
    #include <lauxlib.h>
    #include <lualib.h>

    static int l_sin(lua_State *L)
    {
        // 如果给定虚拟栈中索引处的元素可以转换为数字,则返回转换后的数字,否则报错。
        double d = luaL_checknumber(L, 1);
        lua_pushnumber(L, sin(d));  /* push result */

        /* 这里可以看出,C可以返回给Lua多个结果,
         * 通过多次调用lua_push*(),之后return返回结果的数量。
         */
        return 1;  /* number of results */
    }

    int main(void)
    {
        lua_State *L = luaL_newstate();    // 创建Lua状态机。
        luaL_openlibs(L);    // 打开Lua状态机"L"中的所有Lua标准库。

        /* 这两句话还有更简单的方法:
         * lua_register(L, "mysin", l_sin)
         * 将C函数"l_sin"定义为Lua的全局变量"mysin"。
         * 其实现是如下宏:
         * #define lua_register(L,n,f)
         *      (lua_pushcfunction(L, f), lua_setglobal(L, n))
         */
        lua_pushcfunction(L, l_sin);    // 将C函数转换为Lua的"function"并压入虚拟栈。
        lua_setglobal(L, "mysin");    // 弹出栈顶元素,并在Lua中用名为"mysin"的全局变量存储。

        const char* testfunc = "print(mysin(3.14 / 2))";

        if(luaL_dostring(L, testfunc))    // 执行Lua命令。
            printf("Failed to invoke. ");
        lua_close(L);    // 关闭Lua状态机。

        return 0;
    }

    运行

    lu@lu-virtualbox:~/project3/lua/lua->c$ gcc -o test.out test2.c -ldl -lm -Wall -I /usr/include/lua5.1 -llua5.1

    lu@lu-virtualbox:~/project3/lua/lua->c$ ./test.out

    0.99999968293183

    总结

    总的来讲,这是一份C程序。C程序里面创建了lua的运行环境,即可运行lua代码。lua代码里面又调用了C函数(调用之前已将C函数转换为了lua的函数并压入了虚拟栈)。

    本来的C函数l_sin() 被 搞搞搞 搞成了lua的函数mysin

  • 相关阅读:
    C++调试帮助
    C++中的前置(后置)++与--
    C++11 使用using定义类型别名
    C++11 尾置返回类型
    [BUUCTF]PWN——pwnable_hacknote
    [BUUCTF]PWN——ciscn_2019_es_7[详解]
    [BUUCTF]PWN——mrctf2020_easyoverflow
    [BUUCTF]PWN——wustctf2020_closed
    [BUUCTF]PWN——0ctf_2017_babyheap
    [BUUCTF]PWN——ciscn_2019_s_4
  • 原文地址:https://www.cnblogs.com/liyongjun/p/9657591.html
Copyright © 2011-2022 走看看