Test函数中列举了常用的一些API,做了一个测试,用到的时候方便查阅。

//打印栈中内容
void print_stack(lua_State * l)
{
    int n = lua_gettop(l);
    for(int i=1;i<n+1;i++)
    {
        switch(lua_type(l,i))
        {
            case LUA_TSTRING:
                cout<<lua_tostring(l,i)<<"\t";
                break;
            case LUA_TNUMBER:
                cout<<lua_tonumber(l,i)<<"\t";
                break;
            case LUA_TNIL:
                cout<<"nil"<<"\t";
                break;
        }
    }
    cout<<endl;
}

void test(lua_State * l)
{
    //lua的API所有的第一个参数都是一个全局的变量,数字一般代表栈的下标

    //向栈内压入元素
    lua_pushnil(l);
    lua_pushnumber(l,2);
    lua_pushlstring(l,"hello",5);

    //打印栈中得内容
    print_stack(l);

//扩大栈的可用尺寸,栈的默认尺寸是20,此函数会确保堆栈上至少有sz(第二个参数)个空位。如果不能把堆栈扩展到相应的尺寸,函数返回false。这个函数永远不会缩小堆栈;如果堆栈已经比需要的大了,那么就放在那里不会产生变化。
    lua_checkstack(l,20);

    //查询元素
    cout<<lua_isnil(l,1)<<endl;
    //检查能否转化为字符串类型,这里为真
    cout<<lua_isstring(l,2)<<endl;
    //栈的下标为-1,代表栈顶
    cout<<lua_isnumber(l,-1)<<endl;

    //判断类型
    cout<<lua_type(l,2)<<endl;
    //#define LUA_TNIL		0
    //#define LUA_TBOOLEAN		1
    //#define LUA_TLIGHTUSERDATA	2
    //#define LUA_TNUMBER		3
    //#define LUA_TSTRING		4
    //#define LUA_TTABLE		5
    //#define LUA_TFUNCTION		6
    //#define LUA_TUSERDATA		7
    //#define LUA_TTHREAD		8
    //#define LUA_NUMTAGS		9

    //获取值
    //将字符串的长度放到len中
    size_t len;
    cout<<lua_tolstring(l,3,&len)<<" "<<len<<endl;
    //#define lua_tostring(L,i)	lua_tolstring(L, (i), NULL)
    cout<<lua_tostring(l,3)<<endl;
    //指定的元素不具有正确的类型,返回0或者是null
    cout<<lua_tonumber(l,3)<<endl;

    //栈顶下标
    cout<<lua_gettop(l)<<endl;
    //设置栈顶的位置,多出来得数据丢弃,少得元素位置处补nil
//    lua_settop(l,4);
    //清空栈
//    lua_settop(l,0);
    //从栈中弹出n个元素 #define lua_pop(L,n)	lua_settop(L, -(n)-1)
//    lua_pop(l, 2);

    //将下标为3的值的副本再次入栈
    lua_pushvalue(l,3);
    print_stack(l);

    //将1这个位置的元素和以上的元素全部上移,将栈顶处的元素放到这个位置,相当于做了一个循环
    lua_insert(l,1);
    print_stack(l);
    //删除指定索引上的元素,将它上边的元素下移
    lua_remove(l,3);
    print_stack(l);
    //弹出栈顶的值,并把他放到指定的位置处
    lua_replace(l,2);
    print_stack(l);
}

int main(int argc, const char * argv[])
{
    //创建一个新的Lua环境
    lua_State * l= luaL_newstate();

    //打开需要的库
    luaL_openlibs(l);

    //一些常用的lua函数API测试
    test(l);

    //关闭
    lua_close(l);

    return 0;
}

Lua常用C API