Lua呼叫C 的函式

2021-06-27 07:04:11 字數 3093 閱讀 2709

1. 

lua呼叫

c++的函式

lua要呼叫

c++的函式還是蠻方便的,首先,我們來建立乙個

c++函式先:

[cpp]view plain

copy

print

?public

:  static

intgetnumber(

intnum);  

inthellolua::getnumber( 

intnum )   

類的什麼的,我就忽略了,直接上函式。

(旁白:= =

好懶!)

這是乙個很簡單的函式,給出乙個值,返回乙個+1

後的值。

現在,我們想在lua

中呼叫這個函式,得多寫乙個函式。

(旁白:那個,為嘛getnumber

函式是靜態的?)

[cpp]view plain

copy

print

?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"

snippet_file_name=

"blog_20141015_3_3789756"

name=

"code"

class

="cpp"

>

bool

hellolua::init() 

最後還要修改hellolua.lua指令碼檔案:

-- 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棧狀態需要自己進行維護,若...