最近一直在忙着改前端的東西,固然也遇到了一些問題,因此記錄一下前端
在cocos2dx 3.0 中提供了新的c/c++函數導出到lua使用的工具,貌似是基於python改的。在對於cocos2dx 2.x的項目中,仍是使用的tolua++來做爲導出的輔助工具。順便介紹一下tolua++吧,熟悉lua的開發者都知道,當須要暴露一個函數或者類型亦或者接口給lua使用時,要編寫一些橋接函數,按照lua capi定義的風格編寫,而後再註冊到luastate裏。但程序員都是一幫能偷懶就偷懶的人,因而就有人想到經過作工具來完成這些事情。因而就誕生了tolua++、luabind等項目。tolua++是個很長時間沒有更新過的項目了,網上能搜到的例子很少,直到最近cocos2d-x中使用了它來做爲橋接c/c++到lua的工具才又引發了關注。因此,若是一個對lua不熟悉的人一上來就用tolua++的話會以爲很頭昏,因此建議在用tolua++以前,最好先搞清楚不借助工具的狀況下,簡單的導出c/c++函數給lua的橋接函數該怎麼寫, 這個能夠參考《LUA程序設計(第2版)》的最後幾章的內容來學習。</br> 書歸正傳,在tolua++提供的一些c函數中,並無提供對應於lua capi的pushlstring的接口,因此這個時候要傳遞一個字節流給lua的時候就有點翻嘀咕了,若是我傳遞的一個字節流裏帶有了'\0',那麼在tolua生成的橋接函數裏,會使用了pushstring來傳遞該參數給lua的棧, 那麼這個字節流會被截斷麼?帶着這個疑惑,在網上搜了下,又翻閱了一遍LUA程序設計(第2版)》,發現裏面有句話大概寫的意思是說:「在lua的string是能夠內部容許出現'\0'的,當指定未指定長度時,會使用strlen來獲取」,這下我傻眼了,那麼若是使用pushstring的話,按照書裏的這個解釋,那麼strlen勢必會截斷中間含有'\0'的字符串啊。後來網上也有人在cocos2dx的論壇上給提建議說,在toluafix_xxxx的函數中增長對pushlstring的支持。可是這仍是無法解決想要傳遞可能含有'\0'字節流的char* 給lua的問題,後來再三搜索,無心中看到了lua裏pushstring函數的實現代碼,確實,pushstring的調用至關因而pushlstring的調用而且在長度參數傳遞了NULL, 而pushlstring裏獲取長度也是確實使用了strlen,可是,注意可是! 它的strlen並非標準庫的strlen, 而是本身實現的strlen, 因此也就是說, 其實傳遞的時候是不會被截斷的!只是須要注意的是,當lua要是給c++傳遞的時候,c++是沒辦法獲取真實長度的,因此在設計api接口時,再額外傳遞一個真是長度參數便可解決這個需求了。python