1.
lua呼叫
c++的函式
lua要呼叫
c++的函式還是蠻方便的,首先,我們來建立乙個
c++函式先:
[cpp]view plain
copy
?public
: static
intgetnumber(
intnum);
inthellolua::getnumber(
intnum )
類的什麼的,我就忽略了,直接上函式。
(旁白:= =
好懶!)
這是乙個很簡單的函式,給出乙個值,返回乙個+1
後的值。
現在,我們想在lua
中呼叫這個函式,得多寫乙個函式。
(旁白:那個,為嘛getnumber
函式是靜態的?)
[cpp]view plain
copy
?public
: static
intcpp_getnumber(lua_state* pl);
inthellolua::cpp_getnumber( lua_state* pl )
(旁白:又是靜態的!)
這是怎麼回事呢?我們很清楚,lua
和c++
只能通過堆疊通訊,所以
lua是不可能直接呼叫
getnumber
函式的,所以我們建立乙個
cpp_getnumber
函式作為中介。
cpp_getnumber函式有乙個
lua_state* pl
引數,有了這個引數,
c++就能從
lua的堆疊中取值了,剩下的都很簡單,不想過多的解釋
...
還是解釋一下吧。
(旁白:你妹紙的,我就知道!)
1) 首先,lua
指令碼裡會呼叫
cpp_getnumber
函式,至於為什麼能呼叫,一回解釋,我知道旁白一定會問的。
(旁白:有種無力吐槽的感覺。。。)
2) 當cpp_getnumber
被呼叫時,一切又回到
c++對
lua的操作了,棧頂裡會存放函式所需要的引數,取出來用就可以的。
3) lua呼叫
cpp_getnumber
之後,需要乙個結果,當然,這個結果同樣只能存放在棧裡,所以理所當然地要把
getnumber
的結果入棧。
4) 最後,cpp_getnumber return
了乙個值,這個值不是函式的執行結果,而是
getnumber
需要返回值的個數(
lua支援多個返回值的函式)
旁白,你明白了麼?
(旁白:額。。。沒明白)
好,既然大家都明白了,我就不多說了~
(旁白:你妹紙的o o
!)------------------------------------------- 來自2014.10.15的補充 begin-------------------------
十分抱歉,萬分抱歉!我漏了很重要的內容,那就是lua中如何呼叫c++的函式的?
補充如下:
現在,要開始使用這兩個函式了,修改hellolua的init函式:
[cpp]view plain
copy
print?
"403406"最後還要修改hellolua.lua指令碼檔案:snippet_file_name=
"blog_20141015_3_3789756"
name=
"code"
class
="cpp"
>
bool
hellolua::init()
-- hellolua.lua檔案
local num = cpp_getnumber(10);
用除錯模式執行專案,我們將看到以下日誌輸出:
getnumber num = 10
代表getnumber函式被呼叫了,換句話說,cpp_getnumber被成功呼叫了。
現在來解釋最重要的一點,為什麼在lua裡能夠呼叫cpp_getnumber函式,lua可以通過lua_register將c++的靜態函式註冊到lua中,這樣lua就可以直接呼叫c++的函式。
至於為什麼cpp_getnumber函式為什麼非得是靜態的,很簡單,如果不是靜態函式,就必須在物件被建立之後才能呼叫。在lua中是不能也不會去再次建立乙個hellolua物件的(當然,在lua中還是能夠建立c++物件的,這個暫時不討論),因此,註冊的函式必須是靜態的。
--------------------------------------- 來自2014.10.15的補充 end-------------------------
2. 結束了
最後,關於lua
的教程,到此告一段落了,本來我還想寫寫
luabind
的教程的(非常強大!)。但是,寫教程是一件很耗時的工作,
10分鐘能學會的知識,也許我要花
2個小時才能誕生一篇教程。
不過,如果大家把這6
篇教程吃透,然後再去用
lua在
cocos2d-x
裡開發,就沒什麼大的難度了。(最好再去了解一下
luabind)
或許,我以後會接著寫lua
的教程,而現在,我要繼續學習
cocos2d-x去了~
因為寫教程的緣故(這兩周一直在寫狀態機的教程以及
lua的教程),我停止了接近兩周的時間。得抓緊了
~不能落後~
那麼,祝大家元旦快樂。
(旁白:你確定你元旦之後會發這篇教程麼?)
然後,希望大家輕輕地動一下滑鼠,點一下「頂」~嘿嘿
.
lua呼叫c函式
最近在進入lua程式設計的狀態,一度令我困惑的是,lua提供的功能少的可憐,跟自備電池的python相比,可說是簡陋了。連table的列印,都需要自己實現,也因此有了一打的第三方方案。後來我想明白了,以lua和c如此緊密的關係,只需要建立lua的binding,那麼豐富而效能強大的c庫資源完全可以為...
lua呼叫c函式
lua可以呼叫c函式的能力將極大的提高lua的可擴充套件性和可用性。對於有些和作業系統相關的功能,或者是對效率要求較高的模組,我們完全可以通過c函式來實現,之後再通過lua呼叫指定的c函式。對於那些可被lua呼叫的c函式而言,其介面必須遵循lua要求的形式,即 typedef int lua cfu...
lua呼叫C函式
lua採取的是利用棧進行互動,利用各種lua push 將不同的值壓入棧中,然後呼叫lua指令碼時自然會退棧取出引數執行,對於lua的虛擬機器來說,就像是發生了一次正常的函式呼叫。這裡採用的棧是lua棧,因為若是c棧的話呼叫lua的c api就會出錯了。需要注意的是,lua棧狀態需要自己進行維護,若...