首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Lua和C如何交互(二)

上一篇文章描述了Lua和C交互的原理, 这篇文章主要通过Demo程序加深Lua和C的交互....涉及到交互,分为: Lua中如何调用C函数 C中如何调用Lua函数 这里先描述C中如何调用Lua函数, 想象一下, C到底怎么和Lua进行通信,如何告诉它我调用的是xxx参数?...Lua采取的是利用栈进行交互 Lua提供了C API对栈进行操作, 利用各种Lua_pushXXX将不同的值压入栈中,然后调用Lua脚本时自然会退栈取出参数运行 Lua栈状态需要自己进行维护,若发生多线程同时对.../* 出栈,将给定索引处的Lua值转换为C字符串 */ printf("str = %s\n",str); } lua_getglobal(L,”str”) 执行两步操作 首先将str放入栈中...然后由Lua去全局表中匹配str的值,并将str的值返回栈顶 luaL_dofile(L,”helloscript.lua”); 它是这样子定义的: #define luaL_dofile(L

1.3K10

Lua和C如何交互(一)

要理解Lua和C的交互,先要理解堆栈和全局表两个概念 堆栈 Lua和C/C++语言交互的主要方法是一个无处不在的虚拟栈,栈的特点是先进后出. ?...: name = “hello world” 全局表中存放了name和hello world的对应关系, 可以通过name在全局表中找到对应的hello world 交互方式 hello.lua...C/C++想要获取Lua中的name字符串的值, 首先把name放到堆栈(栈顶),方便Lua看到; Lua从堆栈(栈顶)获取到name的值, 此时栈顶变为空; Lua去全局表中查找name对应的字符串;...全局表返回对应的字符串hello world; Lua再次把hello world放到堆栈(栈顶); C/C++从堆栈(栈顶)获取name的值. ?...**注意:**为了更好的展示原理,文中的图片来自于网络上博客中图片. 参考 Lua篇(第01章):让Lua和C++牵手 Lua初学者(四)–Lua调用原理展示(lua的堆栈)

1.4K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux下lua安装以及和c的交互

    lua安装,与c交互的过程记录 lua安装 在此我的机器环境是cenos 6.8 我安装的是lua5.1.4版本 安装lua编译的相关依赖 yum -y install readline-devel...,开始和c语言的交互之旅行吧 网上很多介绍c和lua交互的,但是在linux下面的编译介绍却没找到,在此自己记录下,也方便大家查看 在lua模块安装完成后,可以用命令find / -name ‘lua.h...1实现自己的第一个c调用C的例子 test.lua print("lua script test.lua have been load--") function showinfo() print...gcc test.c -o test -llua -lm -ldl 2实现自己的第一个lua调用C的例子 c_lua.c #include #includelua.h>...建立lua所有变量(包括函数)的全局表 lua_getglobal(L,"lua2c_add");// 在lua的全局表查找lua2c_add函数,并压入栈底 lua_pushinteger

    83120

    lua 和c的调用

    lua中使用c动态库,像luacjson(支持unicode),luasocket,都是以动态链接库的形式在lua中使用的,至于怎么写这些动态链接库很少有教程说到,下面我就说说如何把c文件编译成动态库。...首先,假设需要在lua中调用一个在c中实现的求和函数,函数名add(a,b)。 我给这个测试库取名为dylib,它包含一个函数add。...lua中这样使用: local dylib = require "dylib.test" local c = dylib.add(1,2) print(c) 上面的dylib.test就是我编译生成的dylib...int c = a+b; lua_pop(L,2); lua_pushnumber(L,c); return 1; } 这函数就是把两参数加起来,然后返回和。...对于一个Lua文件来说,我们可以很轻易的改掉它的名称,但是对于一个C程序库来说,我们是没有办法编辑其中的luaopen_函数的名称的。

    72220

    lua调用C函数

    Lua采取的是利用栈进行交互,利用各种Lua_pushXXX将不同的值压入栈中,然后调用Lua脚本时自然会退栈取出参数运行,对于Lua的虚拟机来说,就像是发生了一次正常的函数调用。...(这里采用的栈是Lua栈,因为若是C栈的话调用Lua的C API就会出错了。)...需要注意的是,Lua栈状态需要自己进行维护,若发生多线程同时对Lua栈操作,没有加锁保护的话会导致栈状态混乱然后出很诡异的bug 摘自  多语言协作与二进制交互 函数接口 typedef...struct lua_State lua_State; lua虚拟机(或叫解释器),可以理解为一个thread,和一个完整的Lua虚拟环境的执行状态。...typedef int (*lua_CFunction) (lua_State *L); 能够被Lua调用的C函数都必须是这种规则。函数的返回的int值表示C函数返回值的个数。

    2.8K31

    C语言调用lua

    C语言是一种非常流行的编程语言,而Lua是一种基于C语言开发的脚本语言。相信大家都知道,Lua可以使用C语言来扩展其功能,进而实现更复杂的功能。...C语言调用luajit 在使用C语言调用luajit之前,我们需要先了解一些必要的概念。首先,我们需要掌握一些基本的lua函数调用的方法。...同时,我们也需要掌握luaL_openlibs函数,它可以打开Lua的标准库,以便我们可以在C语言中使用Lua的函数。 当我们了解了这些基本概念之后,我们就可以开始编写C语言调用luajit的代码了。...的字符串。 C语言向Lua传递参数 当我们需要将C语言中的参数传递给Lua脚本时,我们可以使用lua_push*函数系列将其压入到栈中。这个函数系列包括了很多不同的函数,用于不同类型的参数。...C语言传递结构体参数 当我们需要将一个结构体参数传递给Lua脚本时,我们需要先了解一些序列化和反序列化的知识。在C语言中,我们可以将结构体序列化为一个二进制数据流,然后将其作为字符串传递给Lua脚本。

    31720

    【IOS开发高级系列】Lua与OC交互专题

    1 Lua语法 Lua教程 http://www.yiibai.com/lua/lua_environment.html 2 Lua与OC交互 2.1 Lua与OC交互原理 用Lua编写iOS程序 http...这意味着,你可以从Lua里面,使用任何和全部的Objective-C类及框架。         从技术上来讲,Wax结合了Objective-C类和原生C代码。...和许多"大而全"的语言不一样,网路通讯、图形界面等都没有默认提供。但是Lua可以很容易地被扩展:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。...(468K)下载次数:236 3 参考链接 objective-c与Lua的交互(一)  http://www.cocoachina.com/bbs/read.php?.../details/43269693 objective-c与Lua的交互(二) http://blog.csdn.net/wildfireli/article/details/12277549 Wax

    38920

    Lua和Luajit

    C的API来使用 三、不足和不同 1)lua没有强大的库,所以很多功能实现起来没有python、perl、ruby等脚本语言简洁 2)lua的异常处理功能饱受争议,虽然其提供了pcall和xpcall...++中应用广泛的a++和a+=1等操作 8)lua的索引是从1开始的,而不是我们熟悉的0(string,table) 9)当你给一个元素赋值为nil时相当于这个元素不存在 10)lua的数值类型只有...number是没有int,float,double等之分的 11)lua中没有类的概念,其类是通过table的形式来实现的 12)lua中只有nil和false是表示假的,零在lua中是为真的 13...另外,原生lua、luajit的jit模式(pc和安卓可用)、luajit的interpreter模式(ios下只能运行这个),他们执行lua的原理是有很大的不同的,也导致一些lua优化技巧并不见得是通用的...因此luajit在拥有这些信息之后就可以生成机器码,跟c编译器一样做到无缝的调用,而不需要像标准的lua与c交互那样需要调用pushint等等函数来传参了。

    1.6K10

    C语言调用Lua函数

    现在工作了,大量的零碎时间用于上微博,知乎,QQ。这些碎片化的阅读让人读起来轻松,也能获取些粗浅的信息。 然而它们是消耗时间的黑洞,时间就这样一分一秒地飞逝,年末的时候,知乎会告诉你回答了多少问题。...期待让你眼前一亮的信息。结果往往是趁兴而去,败兴而回。屏幕上的信息永无止境界滚动着,是如此的热闹,仿佛每一个人都在狂欢,而我的内心却如此的空虚与孤独。 在lua API中。...调用一个函数的步骤非常easy: 1.压入你要调用的函数,使用lua_getglobal。 2.压入调用參数。 3.使用lua_pcall 4.从栈中弹出结果。...我们就能够定义个c函数来封装这个调用: /* call a function ‘f’ defined in Lua */ double f (double x, double y)..., -1); lua_pop(L, 1); return z; } lua_pcall在压入结果的之前,会将函数,和參数弹出,假设返回多个结果,第一个最先压入。

    2.6K20

    【Unity游戏开发】浅谈Lua和C#中的闭包

    一、前言   目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#。通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑。...那么,马三今天就要和大家来谈谈Lua和C#中的闭包,下面首先让我们先来谈谈Lua中的闭包。...而对于传统的C++开发者或者C#开发者来说,闭包这个词或多或少都会有些玄之又玄的感觉。那么,在开讲之前,让我们先来了解几个Lua中基础知识和概念,这样有助于我们理解Lua闭包。...其实我们可以把Lua中的闭包和C++中的类做一下类比。闭包是数据和行为的结合体,这就好比C++中的类,有一些成员变量(Lua中的upvalue)+成员方法(Lua中的内嵌函数)。...四、总结   无论是在Javascript、Lua还是C#开发中,闭包的使用相当广泛,也正是由于闭包和各种语法糖的存在,才使得我们的代码更加简洁,使用更方便。

    2.5K31

    FFLIB之FFLUA——C++嵌入Lua&扩展Lua利器

    Lua尽管小巧,却支持比较先进的编程范式,lua 中的匿名函数和闭包会让代码写起来更加 优雅和高效,如果某人使用的C++ 编译器还比较老套,不支持C++11,那么可以尽快感受一下lua的匿名函数和闭包。...扩展LUA: 这也是非常重要的操作,嵌入lua总是和扩展lua相伴相行。lua若要操作C++中的对象或函数,那么必须先把C++对应的接口注册都lua中。...高级特性: 通过以上的介绍,也许你已经了解了FFLUA的设计原则,即:当在编写C++代码时,希望使用LUA就像使用C++本地的代码一样,而在lua中操作C++的数据和接口的时候,又希望C++用起来完全跟...这样可以大大减轻程序开发的工作,从而把精力更多放大设计和逻辑上。那么做到如何lua才算像C++,C++做到如何才算像lua呢?...重要的类型检查有: STL转成Luatable时,STL中的类型必须是lua支持的,包括基本类型和已经注册过的C++对象指针。

    2.4K70

    红包雨中:Redis 和 Lua 的邂逅

    Thus, the letter C doesn’t really belong in ACID. 原子性,隔离性和持久性是数据库的属性,而一致性(在 ACID 意义上)是应用程序的属性。...应用可能依赖数据库的原子性和隔离属性来实现一致性,但这并不仅取决于数据库。因此,字母 C 不属于 ACID 。...Lua 脚本可以很容易的被 C/C ++ 代码调用,也可以反过来调用 C/C++ 的函数,这使得 Lua 在应用程序中可以被广泛应用。...不仅仅作为扩展脚本,也可以作为普通的配置文件,代替 XML, Ini 等文件格式,并且更容易理解和维护。 Lua 由标准 C 编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。...但在编写 Lua 脚本时,要注意如下两点: 为了避免 Redis 阻塞,Lua 脚本业务逻辑不能过于复杂和耗时; 仔细检查和测试 Lua 脚本 ,因为执行 Lua 脚本具备一定的原子性,不支持回滚。

    60100

    【小白学Lua】之Lua变长参数和unpack函数

    一、简介   Lua的变长参数和unpack函数在实际的开发中应用的还挺多的,比如在设计print函数的时候,需要支持对多个变量进行打印输出,这时我们就需要用到Lua中的变长参数和unpack函数了。...接着我们再来看看unpack函数,在Lua里面我们通常使用它来将数组形式的table拆开。...,代码如下: local info={1,2,3,nil,5,p=6} local a,b,c,d,e,f=unpack(info) print(a,b,c,d,e,f) 输出结果:1 2 3...然后分别定义printTable和printExt函数。printTable使用递归的方式对表中的元素进行遍历及打印。printExt会遍历外部传进来的多参数,然后根据类型进行分别处理。...运行效果如下: 1 2 3 123 456 abc 四、总结   在本篇博客中,马三同大家一起了解了Lua中变长参数和unpack函数的使用,并且通过拓展原生print函数的实例进行了练习。

    4.1K30
    领券