提到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 */ }