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 */
    
}
相关文章
相关标签/搜索