Lua和C語言的互動(一)

2021-06-21 05:58:26 字數 2297 閱讀 5672

lua生來就是為了和c互動的,因此使用c擴充套件lua或者將lua嵌入到c當中都是非常流行的做法。要想理解c和lua的互動方式,首先要回顧一下c語言是如何處理函式引數的。

c函式和引數

大家知道c語言是用彙編實現的,在組合語言中可沒有函式的概念,與函式對應的是叫做子過程的東西,子過程就是一段指令,乙個子過程與它呼叫的子過程之間通過棧來進行引數的傳遞互動。在乙個子過程在呼叫別的子過程之前,會按照約定的格式將要呼叫的子過程需要的引數入棧,在被呼叫的子過程中,可以按照約定的規則將引數從棧中取出。同理,對於返回值的傳遞也同樣是通過堆疊進行的。c語言約定的引數放入棧中的格式,就是「呼叫慣例」。c語言的函式原型則決定了壓入棧中的引數的數量和型別。

lua的虛擬堆疊

lua和c之間的互動巧妙的模擬了c語言的堆疊,lua和c語言之間的相互呼叫和訪問都通過堆疊來進行,巧妙的解決了不同型別之間變數相互訪問的問題。具體的,我們想象如下乙個圖

+-------+                      +-------+

| | | |

| | +-------+ | |

| c | <==> | | <==> | lua |

| space | |virtual| | space |

| | | stack | | |

| | | | | |

+-------+ +-------+ +-------+

由於c和lua是不同層次的語言,因此c語言的變數和lua中的變數以及函式不能直接的互動,我們假定c語言和lua都有自己的「空間(c space和lua space)」。而這兩個空間之間的互動就通過上圖中的這個虛擬堆疊來解決。為何採用虛擬堆疊的方式來進行互動呢?其目的是在提供強大的靈活性的同時避免互動時兩種語言變數型別的組合**。

c語言讀寫lua全域性變數(基本型別)

c語言讀取lua的全域性變數是一種最簡單的操作。通過上圖我們可以猜測到,如果通過c語言讀取lua中的全域性變數需要兩步:1、將全域性變數從lua space壓入虛擬堆疊;2、從堆疊將全域性變數讀取到c語言space中。在lua和c的互動中,lua無法看到和操作虛擬堆疊,僅在c語言中有操作堆疊的權利,因此前面說到的兩步全都是在c語言中完成的。我們看乙個簡單的例子

lua**:

global_var1 = 5;

print("print global varb from lua", global_var1);

c**:

......

void get_global(lua_state *l)

......

執行結果:

pi@raspberrypi ~/programming/article_lua $ ./a.out global_var.lua

print global var from lua 5

read global_var: 5

lua中對堆疊的操作都是通過索引來進行的,索引為1表示從棧底數第乙個元素,索引為2表示從棧底數第二個元素;同樣也可以使用負數從棧頂開始計算,-1表示從棧頂數第乙個元素,-2表示從棧頂數第二個元素。更多堆疊的操作函式請參考lua的官方手冊 同樣從堆疊中獲取元素,除了我們使用的lua_tonumber之外,還有lua_tolstring,lua_toboolean等。

通常情況下在讀取變數之前還需要對堆疊中元素的實際型別做出檢查:

c**:

......

void get_global(lua_state *l)

......

寫入全域性變數也一樣簡單:

首先將資料壓入堆疊,然後再將堆疊中的資料存入全域性變數。

c**:

void set_global(lua_state *l)

執行結果:

pi@raspberrypi ~/programming/article_lua $ ./a.out global_var.lua

set global var from c:9

print global var from lua 9

Lua和C語言的互動(一)

lua生來就是為了和c互動的,因此使用c擴充套件lua或者將lua嵌入到c當中都是非常流行的做法。要想理解c和lua的互動方式,首先要回顧一下c語言是如何處理函式引數的。c函式和引數 大家知道c語言是用彙編實現的,在組合語言中可沒有函式的概念,與函式對應的是叫做子過程的東西,子過程就是一段指令,乙個...

Lua和C 語言的互動詳解

前言 寫過windows程式的人都知道,對於應用程式,如果需要在本地儲存一些配置資訊,我們經常將這些配置資訊寫在登錄檔或者本地的配置檔案中,很多應用都是將一些配置資訊寫在配置檔案中,比如以ini結尾的檔案,這種配置檔案很多,使用的很廣泛,然後應用程式在啟動的時候,就會解析這個配置檔案,讀取一些配置資...

Lua和C語言的互動 C API

lua可作為擴充套件性語言 lua可以作為程式庫用來擴充套件應用的功能 同時也是個可擴充套件的語言 lua程式中可以註冊由其他語言實現的函式 c和lua互動的部分稱為c api。c api是乙個c 與lua進行互動的函式集。他由以下部分組成 讀寫lua全域性變數的函式 呼叫lua函式的函式 執行lu...