zoukankan      html  css  js  c++  java
  • C语言中调用Lua

    C语言和Lua天生有两大隔阂:

    一、C语言是静态数据类型,Lua是动态数据类型

    二、C语言需要程序员管理内存,Lua自动管理内存

    为了跨越世俗走到一起,肯定需要解决方案。

    解决第一点看上去比较容易,C语言中有union。

    可是第二点呢?万一C语言正引用着Lua的一个值,Lua自动释放了怎么办?

    所以就有了一种比union更好的解决方案:栈。

    这是一个虚拟的栈,是沟通两者的桥梁,两者的数据交换全都通过这个栈进行,这样只要不pop,Lua就不会自动释放,而什么时候pop由C语言说了算。

    下面是一段喜闻乐见的示例。

    由于新建的cpp文件,所以需要extern "C" 。

     1 #include <stdio.h>
     2 extern "C" {
     3     #include <lua.h>
     4     #include <lauxlib.h>
     5     #include <lualib.h>
     6 }
     7 
     8 //调用lua中的add函数
     9 int call_lua_add(lua_State *L)
    10 {
    11     lua_getglobal(L, "add"); //获取add函数
    12     lua_pushnumber(L, 123); //第一个操作数入栈
    13     lua_pushnumber(L, 456); //第二个操作数入栈
    14     lua_pcall(L, 2, 1, 0); //调用函数,2个参数,1个返回值
    15     int sum = (int)lua_tonumber(L, -1); //获取栈顶元素(结果)
    16     lua_pop(L, 1); //栈顶元素出栈
    17     return sum;
    18 }
    19 
    20 int main()
    21 {
    22     lua_State *L = luaL_newstate(); //新建lua解释器
    23     luaL_openlibs(L); //载入lua所有函数库
    24     luaL_dofile(L, "Test.lua"); //执行"Test.lua"文件中的代码
    25     printf("%d
    ", call_lua_add(L));
    26     lua_close(L); //释放
    27     return 0;
    28 }

    下面是Test.lua文件中的内容:

    1 function add(x, y)
    2     return x + y;
    3 end
  • 相关阅读:
    GDUFE ACM-1087
    背包九讲
    OJ4TH|Inverse number:Reborn
    OJ4TH|Let's play a game
    GG第四次作业
    OpenCV(3)其他常用数据类型
    OpenCV学习(2)读取视频和摄像头
    OpenCV(1)读写图像
    GG第三次作业
    GG第二次作业
  • 原文地址:https://www.cnblogs.com/wolfred7464/p/3829790.html
Copyright © 2011-2022 走看看