lua 与 c++或者c 交互的底层原理谁能解释一下?最最底层的,为啥它们调用C或者C++的函数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua 与 c++或者c 交互的底层原理谁能解释一下?最最底层的,为啥它们调用C或者C++的函数?相关的知识,希望对你有一定的参考价值。
因为 lua 解释器就是用 C 语言开发的,而目前 C 语言在协议上与 C++ 是相同的(或者说使用同一套C协议,虽然C++由C衍生,但对于编译器而言反而更像是从C++删减成C,所以C与C++兼容) 参考技术A 在你的脚本开头写上 require 'mydll',就可以调用了。看看error是什么,根据信息去调错。lua编译器也就是解释器,所谓脚本就是加载时编译嘛!
另:调试脚本的方法就是靠log来分析了。lua调用函数当然用文本,要不怎么调。 参考技术B 直接看源码。。。代码在loadlib.c和lapi.c里
参考资料:mnzn2530
UE4 Unlua源码解析8 - Lua与C++之间的参数转换的实现原理
Lua与C++之间的参数转换的实现原理
2.1 Lua传给C++的参数C++怎么转换成C++属性的
PreCall中将Lua参数转换成C++参数,主要发生在下列代码中
CleanupFlags[i] = Property->SetValue(L, Params, FirstParamIndex + ParamIndex, false);
Property->SetValue传入的参数是拿到的Lua参数,当他被放到缓存区的时候为什么成了C++类型
可以看到SetValue调用到的是,虚方法SetValueInternal
首先在PropertyDesc中存储FProperty的时候,用的是联合,所以某一个属性,最终会成为FProperty或者继承FProperty的特例FProperty,然后虚方法SetValueInternal会在每一个特例FProperty中实现,本例中传进来是Lua String的时候,会走到FStringPropertyDesc的SetValueInternal实现,如下二图
可以看到使用Lua APIlua_tostring转换成C的类型。
2.2 C++返回给Lua的参数或者UObjct对象,怎么在Lua端自动变成Lua对象的
此例中,并没有返回给Lua值,如果有的话,参数怎么处理呢,继续看
之前讲过PostCall中,从Params缓存区中读出C++返回值,转换成Lua返回值,Push进Lua栈,返回给Lua。
可以看到PostCall会调用到这里
和Lua转C++很像,调到的是虚方法GetValueInternal,不同的参数有不同的实现
可以看到String的实现,还是通过Lua的API转换
但是有一个比较特殊的存在,会牵扯到其他内容,这个特殊的存在,就是假如返回值是一个UObject的对象呢,怎么转换成Lua呢,按理说是没那么简单的,事实也确实不简单,这里就牵扯到UE对象和Lua对象的绑定,静态绑定和动态绑定,见下节吧!
以上是关于lua 与 c++或者c 交互的底层原理谁能解释一下?最最底层的,为啥它们调用C或者C++的函数?的主要内容,如果未能解决你的问题,请参考以下文章
UE4 Unlua源码解析8 - Lua与C++之间的参数转换的实现原理
UE4 Unlua源码解析8 - Lua与C++之间的参数转换的实现原理