Lua与C的交互

1.1k 词

Lua与C的交互

Lua是一个嵌入式的语言,它不仅可以是一个独立运行的程序,也可以是一个用来嵌入其它应用的程序库。

C API是一个C代码与Lua进行交互的函数集,它由以下几部分构成:

1、 读写Lua全局变量的函数;

2、 调用Lua函数的函数;

3、 运行Lua代码片段的函数;

4、 注册C函数后可以在Lua中被调用的函数;

在C和LUA之间交互的关键在于一个虚拟栈(virtual stack),数据交互通过栈进行。操作数据时,首先将数据拷贝到栈上,然后获取数据,栈中的每个数据通过索引值进行定位,索引值为正时表示相对于栈底的偏移索引,索引值为负时表示相对于栈顶的偏移索引。索引值以1或 -1起始值,因此栈顶索引值永远为-1, 栈底索引值永远为1 。 “栈”相当于数据在Lua和C之间的中转地,每种数据都有相应的存取接口 。

另外,还可以使用栈来保存临时变量。栈的使用解决了C和LUA之间两个不协调的问题:

1、 Lua使用自动垃圾收集机制,而C要求显式的分配和释放内存;

2、 Lua使用动态数据类型,而C使用静态类型;

特别注意的是:

1、每当Lua调用C函数时,C函数会使用一个局部栈,这个局部栈与之前的栈,以及其它正在调用的C函数使用的栈都是相互独立的。Lua和C就使用这个局部的栈进行数据交互。

2、当Lua调用C时,栈至少包含LUA_MINSTACK(20)个位置,程序员也可以使用lua_checkstack函数来增加栈的大小。

3、使用伪索引(Pseudo-Indices)来表示一些不在栈中的数据,比如thread环境、C函数环境、registry、C闭包的upvalues。

thread环境(全局变量也在这里),使用伪索引 LUA_GLOBALSINDEX;

运行中的C函数环境,使用伪索引 LUA_ENVIRONINDEX;

Registry,使用伪索引 LUA_REGISTRYINDEX;

C闭包的upvalues,可以使用lua_upvalueindex(n)来访问第n个upvalue;

原文链接: Lua 与 C 的交互

        <footer class="article-footer">
<div class="authorimage">
    <img src="https://HappyMantou.github.io//assets/img/avatar.JPG" alt="My Avatar" class="img-circle"/>
</div>