Step By Step Lua呼叫C函式

2021-09-30 10:36:55 字數 1967 閱讀 4258

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的模組。

將包含c函式的**生成庫檔案,如linux的so,或windows的dll,同時拷貝到lua**所在的當前目錄,或者是lua_cpath環境變數所指向的目錄,以便於lua解析器可以正確定位到他們。在我當前的windows系統中,我將其copy到"c:\program files\lua\5.1\clibs\",這裡包含了所有lua可呼叫的c庫。見如下c語言**和關鍵性注釋:

#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**:

require

"mytestlib"--

指定包名稱

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

print(mytestlib.add(1.0,2.0

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

【**出處】

Step By Step Lua模組與包

從lua 5.1開始,我們可以使用require和module函式來獲取和建立lua中的模組。從使用者的角度來看,乙個模組就是乙個程式庫,可以通過require來載入,之後便得到乙個型別為table的全域性變數。此時的table就像名字空間一樣,可以訪問其中的函式和常量,如 require mod ...

長呼叫與短呼叫 呼叫門

cs裡的是乙個段選擇子 1 拆分段選擇子,查gdt表 2 該段描述符為系統描述符,s位為0,type為1100,是乙個門描述符 dpl必須為3,不然該描述符的許可權檢查過不去 3 該描述符的16到31位為另外乙個段描述符的選擇子 決定是否提權 另外乙個段描述符 必須是 段 dpl決定是否提權 長呼叫...

庫呼叫,系統呼叫

通過這個問題,可以判斷候選人是否具有豐富的程式設計經驗以及是否具有找出這類問題答案的敏銳感覺。簡明的回答是 函式庫呼叫是語言或應用程式的一部分,而系統呼叫是作業系統 的一部分。你要確保弄懂 trap 自陷 這個關鍵字的含義。系統呼叫是在作業系統核心發現乙個 trap 或中斷後進行的。函式庫呼叫 vs...