一不小心又标题党了?不好意思哈~
翻看了以前的博客,发下废话太多了自己都看不下去啊,恩,以后尽量写得简洁一些。
本文不涉及lua语法学习,如果有需要,请移步:http://book.luaer.cn/
一.lua堆栈
要理解lua和c++交互,首先要理解lua堆栈。
简单来说,Lua和C/c++语言通信的主要方法是一个无处不在的虚拟栈。栈的特点是先进后出。
在lua中,lua堆栈就是一个struct,堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈顶。如图:
二.堆栈的操作
因为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返回一个指向堆栈的指针,其它看注释应该能懂了吧。
如果对extern "C"不熟悉的可以点击这里:http://blog.csdn.net/shun_fzll/article/details/39078971。
其他一些栈操作:
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位置的值
lua_settop将栈顶设置为一个指定的位置,即修改栈中元素的数量。如果值比原栈顶高,则高的部分nil补足,如果值比原栈低,则原栈高出的部分舍弃。
所以可以用lua_settop(0)来清空栈。
三.c++调用lua
我们经常可以使用lua文件来作配置文件。类似ini,xml