lua呼叫c函式

2021-07-02 02:57:18 字數 1742 閱讀 1351

lua可以呼叫c函式的能力將極大的提高lua的可擴充套件性和可用性。對於有些和作業系統相關的功能,或者是對效率要求較高的模組,我們完全可以通過c函式來實現,之後再通過lua呼叫指定的c函式。對於那些可被lua呼叫的c函式而言,其介面必須遵循lua要求的形式,即

typedef int (*lua_cfunction)(lua_state* l)

。簡單說明一下,該函式型別僅僅包含乙個表示lua環境的指標作為其唯一的引數,實現者可以通過該指標進一步獲取lua**中實際傳入的引數。返回值是整型,表示該c函式將返回給lua**的返回值數量,如果沒有返回值,則return 0即可。需要說明的是,c函式無法直接將真正的返回值返回給lua**,而是通過虛擬棧來傳遞lua**和c函式之間的呼叫引數和返回值的。這裡我們將介紹兩種lua呼叫c函式的規則。

1. c函式作為應用程式的一部分。

#include #include #include #include #include //待lua呼叫的c註冊函式。

static int add2(lua_state* l)

//另乙個待lua呼叫的c註冊函式。

static int sub2(lua_state* l)

const char* testfunc = "print(add2(1.0,2.0)) print(sub2(20.1,19))";

int main()

2. c函式庫成為lua的模組。

#include #include #include #include #include //待註冊的c函式,該函式的宣告形式在上面的例子中已經給出。

//需要說明的是,該函式必須以c的形式被匯出,因此extern "c"是必須的。

//函式**和上例相同,這裡不再贅述。

extern "c" int add(lua_state* l)

extern "c" int sub(lua_state* l)

//lual_reg結構體的第乙個欄位為字串,在註冊時用於通知lua該函式的名字。

//第乙個欄位為c函式指標。

//結構體陣列中的最後乙個元素的兩個欄位均為null,用於提示lua註冊函式已經到達陣列的末尾。

static lual_reg mylibs = ,

,}; //該c庫的唯一入口函式。其函式簽名等同於上面的註冊函式。見如下幾點說明:

//1. 我們可以將該函式簡單的理解為模組的工廠函式。

//2. 其函式名必須為luaopen_***,其中***表示library名稱。lua**require "***"需要與之對應。

//3. 在lual_register的呼叫中,其第乙個字串引數為模組名"***",第二個引數為待註冊函式的陣列。

//4. 需要強調的是,所有需要用到"***"的**,不論c還是lua,都必須保持一致,這是lua的約定,

// 否則將無法呼叫。

extern "c" __declspec(dllexport)

int luaopen_mytestlib(lua_state* l)

見如下lua**

1require "mytestlib"  --指定包名稱

2 3 --在呼叫時,必須是package.function

4 print(mytestlib.add(1.0,2.0))

5 print(mytestlib.sub(20.1,19))

lua呼叫c函式

最近在進入lua程式設計的狀態,一度令我困惑的是,lua提供的功能少的可憐,跟自備電池的python相比,可說是簡陋了。連table的列印,都需要自己實現,也因此有了一打的第三方方案。後來我想明白了,以lua和c如此緊密的關係,只需要建立lua的binding,那麼豐富而效能強大的c庫資源完全可以為...

lua呼叫C函式

lua採取的是利用棧進行互動,利用各種lua push 將不同的值壓入棧中,然後呼叫lua指令碼時自然會退棧取出引數執行,對於lua的虛擬機器來說,就像是發生了一次正常的函式呼叫。這裡採用的棧是lua棧,因為若是c棧的話呼叫lua的c api就會出錯了。需要注意的是,lua棧狀態需要自己進行維護,若...

Lua呼叫C 函式

現在很多伺服器研發為了節約開發成本,邏輯業務採用lua編寫,下面講講工作上遇到的一些問題,記錄方便以後查閱。我們知道用lua寫癩子胡牌演算法可能執行不是很高效,當你有現成的麻將庫,是不是可以繫結給lua使用呢,答案肯定。胡牌演算法,主要是傳遞陣列,下面就實現乙個lua傳遞陣列到c 之後就能使用胡牌演...