Lua C接口API 1

最近工作中用到了Lua作为脚本语言由C/C++宿主语言调用,因为之前没用了解过Lua,在使用过程中遇到不少不懂得地方,因此决定花一段时间好好了解下Lua与C交互的API使用方式,本篇文章为第一篇。

前言

Lua 使用一个虚拟栈来和 C 互传值。栈上每一个元素都是一个 Lua 值。(nil,数字,字符串,等等)。无论何时Lua调用C,被调用的函数都得到一个新的栈,这个栈独立于 C 函数本身的栈,也独立于之前的 Lua 栈。它里面包含了 Lua 传递给 C 函数的所有参数,而 C 函数则把要返回的结果放入这个栈以返回给调用者。

Lua 栈可以使用索引来指向栈上得任何元素:正的索引是栈上得绝对位置(从1开始);负的索引则从栈顶开始的偏移量。

函数

获取栈顶索引

int lua_gettop (lua_State *L);

作用:返回栈顶元素的索引。因为索引是从1开始,所以这个结果等同于栈上得元素个数(返回0表示堆栈为空)

设置栈顶索引

void lua_settop (lua_State *L, int index);

作用:它将栈顶的索引设为这个索引,如果新的栈顶索引比原来大,超出部分的元素会被填为nil。如果新索引为0,则移除所有栈元素。

示例

C 使用 Lua API

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <stdio.h>


int main(int argc, char *argv[])
{
    lua_State *L = lua_open();
    printf("begininit : stack top = %d\n", lua_gettop(L));

    lua_pushnumber(L, 5);
    lua_pushnumber(L, 4);
    printf("pushargvs : stack top = %d\n", lua_gettop(L));

    lua_settop(L, 1);
    printf("settopfun : stack top = %d\n", lua_gettop(L));
    lua_settop(L, 0);
    printf("settopfun : stack top = %d\n", lua_gettop(L));

    return 0;
}

编译执行输出为:

begininit : stack top = 0
pushargvs : stack top = 2
settopfun : stack top = 1
settopfun : stack top = 0

总结

Lua 与 C 之间的操作由栈来传递数据,操作的时候,一定要注意栈顶是否溢出!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,889评论 0 38
  • 当在Lua和C之间交换数据时主要的问题是自动回收与手动回收内存管理的不一致。因此,Lua 用一个抽象的栈在Lua与...
    luffier阅读 2,687评论 0 3
  • 第一篇 语言 第0章 序言 Lua仅让你用少量的代码解决关键问题。 Lua所提供的机制是C不擅长的:高级语言,动态...
    testfor阅读 2,719评论 1 7
  • 1. 写在前面 很多时候我们都需要借助一些脚本语言来为我们实现一些动态的配置,那么就会涉及到如何让脚本语言跟原生语...
    杰嗒嗒的阿杰阅读 3,450评论 9 31
  • 【读经】 诗篇69 【金句】 但我在悦纳的时候向你—耶和华祈祷。神啊,求你按你丰盛的慈爱,凭你拯救的诚实应允我!(...
    chanor阅读 666评论 0 0