Lua 棧的理解

提到C++與lua互調,不可不提棧。網絡

棧是C++和Lua相互通信的一個地方。函數

首先這個棧並非傳統意義上的棧(傳統的棧須要放同一種數據類型,但在網上的某些資料說,每一個棧元素是一個聯合體)。lua

棧從上向下分別是-1,-2,-3... ; 從下向上分別是1,2,3...spa

這也就是lua_gettop爲何能夠得到棧中總元素數的緣由。由於lua_gettop()得到的是從下向上棧頂的索引,由於從1開始,棧頂的索引也便是總元素數。指針

1.code

lua_getglobal(L,「lua變量名");blog

這個函數會將lua中的某變量放置到棧頂,因而C++就能夠取了。索引

2.get

lua_tointeger(L, "某索引")string

將某索引的棧中元素取得(並不出棧),索引可爲正或者負。

同系列的還有lua_toboolean,lua_tostring等。

3.

lua_call(L,參數個數,返回值個數)

在調用以前,要將函數名,各個參數,分別入棧。

4.

lua_register

將某C函數註冊(創建與lua函數的關聯關係 )

能夠想象內部有一個map<string(lua函數名) ,C函數指針>

要注意 函數的返回值要是int ,參數要是lua_State*

查看lua_CFunction的定義,就明白爲何了。

 

 

5.打印整個棧

這個是很重要的一個技巧,尤爲在初學階段。

我就曾經被網上一段錯誤代碼弄的百思不得其解,後來經過打印棧的方式,明白他寫的是錯的。

並且經過打印棧我還發現,調用luaopen_base(L)系列函數時,每調用一個,會在棧中push一個table

這也就是爲何說lua全部變量,函數(函數其實也是變量),

都在lua_State中的緣由。

//該函數來自網絡
void stackDump(lua_State* L)
{
    int i;
    int top = lua_gettop(L);
    printf("stackDump(num=%d):\n",top);
    
    for (i = 1; i <= top; i++) {  /* repeat for each level */
        int t = lua_type(L, i);
        switch (t) {
                
            case LUA_TSTRING:  /* strings */
                printf("`%s'", lua_tostring(L, i));
                break;
                
            case LUA_TBOOLEAN:  /* booleans */
                printf(lua_toboolean(L, i) ? "true" : "false");
                break;
                
            case LUA_TNUMBER:  /* numbers */
                printf("%g", lua_tonumber(L, i));
                break;
                
            default:  /* other values */
                printf("%s", lua_typename(L, t));
                break;
                
        }
        printf("  ");  /* put a separator */
    }
    printf("\n");     /* end the listing */
    
}
相關文章
相關標籤/搜索