Lua和C++交互详细总结_2_堆栈的操作

二、堆栈的操作

因为Lua与C/C++是通过栈来通信,Lua提供了C API对栈进行操作。

我们先来看一个最简单的例子:

#include <iostream>
#include <string.h>
using namespace std;  

extern "C"
{
    #include "lua.h"
    #include "lauxlib.h"
    #include "lualib.h"
}
void main()
{
    //1.创建一个state
    lua_State *L = luaL_newstate();  

    //2.入栈操作
    lua_pushstring(L, "I am so cool~");
    lua_pushnumber(L,20);  

    //3.取值操作
    if( lua_isstring(L,1)){             //判断是否可以转为string
        cout<<lua_tostring(L,1)<<endl;  //转为string并返回
    }
    if( lua_isnumber(L,2)){
        cout<<lua_tonumber(L,2)<<endl;
    }  

    //4.关闭state
    lua_close(L);
    return ;
}

可以简单理解为luaL_newstate返回一个指向堆栈的指针,其它看注释应该能懂了吧。

其他一些栈操作:

int   lua_gettop (lua_State *L);            //返回栈顶索引(即栈长度)
void  lua_settop (lua_State *L, int idx);   //
void  lua_pushvalue (lua_State *L, int idx);//将idx索引上的值的副本压入栈顶
void  lua_remove (lua_State *L, int idx);   //移除idx索引上的值
void  lua_insert (lua_State *L, int idx);   //弹出栈顶元素,并插入索引idx位置
void  lua_replace (lua_State *L, int idx);  //弹出栈顶元素,并替换索引idx位置的值

ua_settop将栈顶设置为一个指定的位置,即修改栈中元素的数量。如果值比原栈顶高,则高的部分nil补足,如果值比原栈低,则原栈高出的部分舍弃。所以可以用lua_settop(0)来清空栈。

时间: 2024-10-13 03:36:02

Lua和C++交互详细总结_2_堆栈的操作的相关文章

Lua和C++交互详细总结_1_Lua堆栈

一.Lua堆栈 要理解Lua和C++交互,首先要理解Lua堆栈. 简单来说,Lua和C/C++语言通信的主要方法是一个无处不在的虚拟栈.栈的特点是先进后出. 在Lua中,Lua堆栈就是一个struct,堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈顶.如图: lua的栈类似于以下的定义, 它是在创建lua_State的时候创建的: TValue stack[max_stack_len]  // 欲知内情可以查 lstate.c 的stack_init

Lua和C++交互详细总结

转自:http://cn.cocos2d-x.org/tutorial/show?id=1474 一.Lua堆栈 要理解Lua和C++交互,首先要理解Lua堆栈. 简单来说,Lua和C/C++语言通信的主要方法是一个无处不在的虚拟栈.栈的特点是先进后出. 在Lua中,Lua堆栈就是一个struct,堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈顶.如图: 二.堆栈的操作 因为Lua与C/C++是通过栈来通信,Lua提供了C API对栈进行操作. 我们

Lua和C++交互详细总结_3_C++调用Lua

三C++调用Lua 我们经常可以使用Lua文件来作配置文件.类似ini,xml等文件配置信息.现在我们来使用C++来读取Lua文件中的变量,table,函数. lua和c通信时有这样的约定: 所有的lua中的值由lua来管理, c++中产生的值lua不知道, 类似表达了这样一种意思: "如果你(c/c++)想要什么, 你告诉我(lua), 我来产生, 然后放到栈上, 你只能通过api来操作这个值, 我只管我的世界", 这个很重要, 因为: "如果你想要什么, 你告诉我, 我来

Lua和C++交互详细总结_5_总结

Lua和C++是通过一个虚拟栈来交互的. C++调用Lua实际上是:由C++先把数据放入栈中,由Lua去栈中取数据,然后返回数据对应的值到栈顶,再由栈顶返回C++. Lua调C++也一样:先编写自己的C模块,然后注册函数到Lua解释器中,然后由Lua去调用这个模块的函数.

Lua和C++交互详细总结_4_Lua调用C++

四.Lua调用C++ 我们分三个方法实现它. 方法一:直接将模块写入Lua源码中 在Lua中调用C/C++,我们可以将函数写lua.c中,然后重新编译Lua文件. 编译好后是这样子的:(如图) 然后我们可以在lua.c中加入我们自己的函数.函数要遵循规范(可在lua.h中查看)如下: typedef int (*lua_CFunction) (lua_State *L); 换句话说,所有的函数必须接收一个lua_State作为参数,同时返回一个整数值.因为这个函数使用Lua栈作为参数,所以它可以

Lua和C++交互总结(很详细)

一不小心又标题党了?不好意思哈- 翻看了以前的博客,发下废话太多了自己都看不下去啊,恩,以后尽量写得简洁一些. 本文不涉及lua语法学习,如果有需要,请移步:http://book.luaer.cn/ 一.lua堆栈 要理解lua和c++交互,首先要理解lua堆栈. 简单来说,Lua和C/c++语言通信的主要方法是一个无处不在的虚拟栈.栈的特点是先进后出. 在lua中,lua堆栈就是一个struct,堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈顶.

lua与C交互

什么样类型的函数可以被Lua调用 typedef int (*lua_CFunction) (lua_State *L); 符合类型的函数怎样处理后才可以被Lua调用 使用lua_register或者 lua_pushfunction和lua_setglobal()把要调用的函数加入到lua状态机中. #define lua_register(L,n,f) / (lua_pushcfunction(L, f), lua_setglobal(L, n)) lua_register的第二个参数就是L

用好lua+unity,让性能飞起来——lua与c#交互篇

前言 在看了uwa之前发布的<Unity项目常见Lua解决方案性能比较>,决定动手写一篇关于lua+unity方案的性能优化文. 整合lua是目前最强大的unity热更新方案,毕竟这是唯一可以支持ios热更新的办法.然而作为一个重度ulua用户,我们踩过了很多的坑才将ulua上升到一个可以在项目中大规模使用的状态.事实上即使到现在lua+unity的方案仍不能轻易的说可以肆意使用,要用好,你需要知道很多. 因此,这篇文章是从一堆简单的优化建议里头,逐步挖掘出背后的原因.只有理解了原因,才能很清

用好Lua+Unity,让万金6.0平台搭建性能飞起来——Lua与C#交互篇

前言万金6.0平台搭建论坛:haozbbs.com Q1446595067 在看了uwa之前发布的<Unity项目常见Lua解决方案性能比较>,决定动手写一篇关于lua+unity方案的性能优化文.整合lua是目前最强大的unity热更新方案,毕竟这是唯一可以支持ios热更新的办法.然而作为一个重度ulua用户,我们踩过了很多的坑才将ulua上升到一个可以在项目中大规模使用的状态.事实上即使到现在lua+unity的方案仍不能轻易的说可以肆意使用,要用好,你需要知道很多.因此,这篇文章是从一堆