最近工作中用到了Lua
作為腳本語言由C/C++宿主語言調(diào)用,因?yàn)橹皼]用了解過Lua
,在使用過程中遇到不少不懂得地方,因此決定花一段時(shí)間好好了解下Lua
與C交互的API使用方式,本篇文章為第一篇。
前言
Lua 使用一個(gè)虛擬棧來和 C 互傳值蔚润。棧上每一個(gè)元素都是一個(gè) Lua 值磅氨。(nil,數(shù)字,字符串,等等)。無論何時(shí)Lua調(diào)用C,被調(diào)用的函數(shù)都得到一個(gè)新的棧,這個(gè)棧獨(dú)立于 C 函數(shù)本身的棧,也獨(dú)立于之前的 Lua 棧嫡纠。它里面包含了 Lua 傳遞給 C 函數(shù)的所有參數(shù),而 C 函數(shù)則把要返回的結(jié)果放入這個(gè)棧以返回給調(diào)用者烦租。
Lua 棧可以使用索引
來指向棧上得任何元素:正的索引是棧上得絕對(duì)位置(從1開始);負(fù)的索引則從棧頂開始的偏移量除盏。
函數(shù)
獲取棧頂索引
int lua_gettop (lua_State *L);
作用:返回棧頂元素的索引叉橱。因?yàn)樗饕菑?開始,所以這個(gè)結(jié)果等同于棧上得元素個(gè)數(shù)(返回0表示堆棧為空)
設(shè)置棧頂索引
void lua_settop (lua_State *L, int index);
作用:它將棧頂?shù)乃饕O(shè)為這個(gè)索引,如果新的棧頂索引比原來大,超出部分的元素會(huì)被填為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;
}
編譯執(zhí)行輸出為:
begininit : stack top = 0
pushargvs : stack top = 2
settopfun : stack top = 1
settopfun : stack top = 0
總結(jié)
Lua 與 C 之間的操作由棧來傳遞數(shù)據(jù),操作的時(shí)候,一定要注意棧頂是否溢出!!