Lua学习笔记--C调用Lua

Lua是一种嵌入式语言,可以很好的嵌入其他应用程序。lua为我们提供了一组灵活的C API,使C代码能够很好的与Lua进行交互。包括读写Lua全局变量,调用Lua函数,运行Lua代码,注册C函数反过来供Lua调用。简单的说,C能调用Lua,反过来Lua也能调用C。真的是灰常强大灵活的脚本!!现在,先来学习一下怎么用C调用Lua。

其实最简单的我们已经做过了,通过一个dofile,运行一个lua脚本文件。

一.栈

Lua与C的交互是通过一个虚拟栈进行的,这个栈对于Lua来说是严格的LIFO(后进先出)的,当调用Lua时,Lua只会改变栈的顶部。不过C有更大的自由度,可以检索栈中元素,甚至在任意位置插入和删除元素。

当Lua启动或者Lua调用C语言时,栈中至少有20个空间的空闲槽,一般调用来说这些空间足够了。如果调用的参数特别特别多,需要先检查槽够不够用,使用下面的函数:

<span style="white-space:pre">	</span>int lua_checkstack(lua_State* L, int sz );
API使用索引来引用栈中的元素,记住最开始的索引为1,不是0!即第一个压入栈中的元素索引为1,第二个压入栈中的元素索引为2,直到栈顶。也可以使用负数的索引来访问栈顶的元素,即-1表示栈顶元素,以此类推。

在C语言的lua库中,提供了几个关于栈中元素操作的函数,由于C语言实现里没有泛型,所以,对应每一种数据类型都提供了一个函数,这里后面的数据类型暂时用*代替。

//检查栈中index索引的数据类型是否是*的类型
int lua_is*(lua_State * L, int index)
//返回栈中index索引的数据的类型
int lua_type(lua_State* L, int index)
//返回栈中index索引的数据的值,转化为*的类型
*   lua_to*(lua_State* L, int index)
//向栈中插入*类型的元素
void lua_push*(lua_State* L, type*)


既然这个东东是个栈,所以当然也提供了一些列栈本身的操作:

//获得栈中元素个数
int lua_gettop(lua_gettop) (lua_State *L);
//设置栈顶为一个指定位置
void lua_settop(lua_settop) (lua_State *L, int idx);
//将指定索引上的值再次压入栈
void lua_pushvalue(lua_State *L, int idx);
//删除指定索引的元素,之上的向下移补缺
void lua_remove(lua_State* L, int idx);
//在index处开辟一个位置,上面的上移,然后将栈顶元素放到这个位置
void lua_insert(lua_State* L, int idx);
//弹出栈顶元素,使用该元素替代index元素
void lua_replace(lua_State* L, int idx);


看一个例子,介个例子里面木有使用lua,直接使用的C语言操作这个栈,并查看其中内容:

// LuaTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>

//因为Lua是C的函数,而我们的程序是C++的,所以要使用extern "C"引入头文件
extern "C"{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#include "luaconf.h"
}

//注意还需要添加之前编译好的Lualib.lib文件,这里通过项目->属性->连接器->附加依赖项添加了
//否则需要 #pragma comment(lib, "lualib.lib")来添加



//打印stack中的数据
void CheckStack(lua_State* L)
{
	int top = lua_gettop(L);//stack的大小
	
	//遍历stack所有层
	for (int i = 1; i <= top; i++)
	{
		int 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值